Devexpress GridView单元格设置带颜色的横向柱状图
本程序需要用到的命令空间:
using System.Drawing;
首先创建一个全局的表示颜色区间的表:
DataTable _ColorRange = new DataTable();
在窗体加载事件中初始化数据:
private void Form1_Load(object sender, EventArgs e)
{
LoadData();
SetColorRange();
}
接下来创建演示数据:
void LoadData()
{
DataTable data = new DataTable();
data.Columns.Add("ProcessName", typeof(string));
data.Columns.Add("CompletePercent", typeof(decimal));
DataRow row1 = data.NewRow();
row1["ProcessName"] = "四色印刷";
row1["CompletePercent"] = 40;
data.Rows.Add(row1);
DataRow row2 = data.NewRow();
row2["ProcessName"] = "模切";
row2["CompletePercent"] = 60;
data.Rows.Add(row2);
DataRow row3 = data.NewRow();
row3["ProcessName"] = "CTP对开";
row3["CompletePercent"] = 96;
data.Rows.Add(row3);
gridControl1.DataSource = data;
}
创建颜色等级:
void SetColorRange()
{
_ColorRange.Columns.Add("ColorRangeValue", typeof(decimal));
_ColorRange.Columns.Add("Color", typeof(string));
_ColorRange.Columns.Add("ColorName", typeof(string));
//0-50为红色
var redRow = _ColorRange.NewRow();
redRow["ColorRangeValue"] = 0;
redRow["Color"] = "Red";
redRow["ColorName"] = "红色";
_ColorRange.Rows.Add(redRow);
//50-95为橘色
var orangeRow = _ColorRange.NewRow();
orangeRow["ColorRangeValue"] = 50;
orangeRow["Color"] = "Orange";
orangeRow["ColorName"] = "橘色";
_ColorRange.Rows.Add(orangeRow);
//95以上为绿色
var greenRow = _ColorRange.NewRow();
greenRow["ColorRangeValue"] = 95;
greenRow["Color"] = "Green";
greenRow["ColorName"] = "绿色";
_ColorRange.Rows.Add(greenRow);
}
下面在Gridview单元格中绘制柱状图并标记颜色:
private void gridView1_CustomDrawCell(object sender, DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs e)
{
if (e.Column.FieldName == "CompletePercent")
{
var value = e.CellValue;
if (value == DBNull.Value)
return;
var percent = Convert.ToDecimal(value);
var width = (int)(Math.Abs(percent) * e.Bounds.Width / 100);
var rect = new Rectangle(e.Bounds.X, e.Bounds.Y, width, e.Bounds.Height);
if (_ColorRange.Rows.Count == 0)
return;
var orderColorTable = (from c in _ColorRange.AsEnumerable() orderby c.Field<decimal>("ColorRangeValue") select c).CopyToDataTable();
var colorConvert = new ColorConverter();
var color = new Color();
var index = 0;
var rowCount = orderColorTable.Rows.Count;
foreach (DataRow row in orderColorTable.Rows)
{
var nextIDValue = 0m;
if (index + 1 < rowCount)
{
var nextRowCell = orderColorTable.Rows[index + 1]["ColorRangeValue"];
if (nextRowCell == DBNull.Value)
continue;
if (!decimal.TryParse(nextRowCell.ToString(), out nextIDValue))
continue;
}
if (index == rowCount - 1)
nextIDValue = decimal.MaxValue;
var colorIDCell = row["ColorRangeValue"];
if (colorIDCell == DBNull.Value)
continue;
var colorIDValue = 0m;
if (!decimal.TryParse(colorIDCell.ToString(), out colorIDValue))
continue;
if (percent >= colorIDValue && percent <= nextIDValue)
{
var colorStrCell = row["Color"];
if (colorStrCell == DBNull.Value)
continue;
var colorStrValue = colorStrCell.ToString();
color = (Color)colorConvert.ConvertFromString(colorStrValue);
break;
}
index++;
}
var brush = new SolidBrush(color);
e.Graphics.FillRectangle(brush, rect);
}
}
对于颜色,我们使用颜色对应的英文字母表示,然后使用colorConvert.ConvertFromString(colorStrValue)把表示颜色的字符串转换成Color类,这样的话,任何颜色都可以识别,不需要对每个颜色都做一次判断
程序运行效果: