摘自 中国.NET论坛
C# Windows Form中如何设置datagrid的各行颜色.
using System; ......
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Collections;
/*用法自定义dataGrid行颜色
* oleDbDataAdapter1.Fill(dataSet11,"学生");
DataGridTableStyle dgt = new DataGridTableStyle();
dgt.MappingName = "学生";
YKDataGridTextBoxColumn dgtbc = new YKDataGridTextBoxColumn();
dgtbc.MappingName = "姓名";
dgtbc.HeaderText= "NAME";
dgtbc.keyColumn=4;
dgtbc.mycolorList.Add(new YKColor(true,Color.Red,Color.Azure));
dgtbc.mycolorList.Add(new YKColor(false,Color.Blue,Color.Brown));
dgt.GridColumnStyles.Add(dgtbc);
dgtbc = new YKDataGridTextBoxColumn();
dgtbc.MappingName = "编号";
dgtbc.HeaderText= "id";
dgtbc.keyColumn=4;
dgtbc.mycolorList.Add(new YKColor(true,Color.Red,Color.Azure));
dgtbc.mycolorList.Add(new YKColor(false,Color.Blue,Color.Brown));
dgt.GridColumnStyles.Add(dgtbc);
DataGridBoolColumn db =
new DataGridBoolColumn();
db.HeaderText= "性别";
db.Width= 150;
db.MappingName = "性别";
dgt.GridColumnStyles.Add(db);
dataGrid1.TableStyles.Add(dgt);
*/
namespace YEKE
{
/// <summary>
/// YKDataGridTextBoxColumn 的摘要说明。
/// </summary>
public class YKColor:object
{
public object val;
public Color foreColor;
public Color backColor;
public YKColor(object v,Color forecolor,Color backcolor)
{
val=v;
foreColor=forecolor;
backColor=backcolor;
}
}
public class YKColorList
{
private ArrayList colorList;
public YKColorList()
{
colorList=new ArrayList();
}
public void Add(YKColor t)
{
colorList.Add(t);
}
public YKColor getColor(object v)
{
YKColor ykc=new YKColor(0,Color.Black,Color.White);
try
{
if(colorList.Count>0)
foreach(YKColor o in colorList )
{
if(o.val.Equals(v))
{
ykc.foreColor=o.foreColor;
ykc.backColor=o.backColor;
break;
}
}
}
catch
{}
return ykc;
}
}
public class YKDataGridTextBoxColumn : DataGridTextBoxColumn
{
public int keyColumn;
public YKColorList mycolorList;
public YKDataGridTextBoxColumn()
{
keyColumn=0;
mycolorList=new YKColorList();
}
protected override void Paint(Graphics g, Rectangle bounds,
CurrencyManager source, int rowNum,
Brush backBrush, Brush foreBrush,
bool alignToRight)
{
/**/ DataRowView drv = source.List[rowNum] as DataRowView;
object expr = drv.Row[keyColumn];
SolidBrush bb,fb;
YKColor ykc=mycolorList.getColor(expr);
bb=new SolidBrush(ykc.backColor);
fb=new SolidBrush(ykc.foreColor);
base.Paint(g, bounds, source, rowNum,
bb, fb, alignToRight);
}
}
public class YKDataGridBoolColumn : DataGridBoolColumn
{
private SolidBrush trueBrush = Brushes.Blue as SolidBrush;
private SolidBrush falseBrush = Brushes.Yellow as SolidBrush;
private DataColumn expressionColumn = null;
private static int count = 0;
public Color FalseColor
{
get
{
return falseBrush.Color;
}
set
{
falseBrush = new SolidBrush(value);
Invalidate();
}
}
public Color TrueColor
{
get
{
return trueBrush.Color;
}
set
{
trueBrush = new SolidBrush(value);
Invalidate();
}
}
public YKDataGridBoolColumn() : base ()
{
count ++;
}
// This will work only with a DataSet or DataTable.
// The code is not compatible with IBindingList implementations.
public string Expression
{
get
{
return this.expressionColumn == null ? String.Empty :
this.expressionColumn.Expression;
}
set
{
if (expressionColumn == null)
AddExpressionColumn(value);
else
expressionColumn.Expression = value;
if (expressionColumn != null &&
expressionColumn.Expression.Equals(value))
return;
Invalidate();
}
}
private void AddExpressionColumn(string value)
{
// Get the grid's data source. First check for a null
// table or data grid.
if (this.DataGridTableStyle == null ||
this.DataGridTableStyle.DataGrid == null)
return;
DataGrid myGrid = this.DataGridTableStyle.DataGrid;
DataView myDataView = ((CurrencyManager)
myGrid.BindingContext[myGrid.DataSource,
myGrid.DataMember]).List
as DataView;
// This works only with System.Data.DataTable.
if (myDataView == null)
return;
// If the user already added a column with the name
// then exit. Otherwise, add the column and set the
// expression to the value passed to this function.
DataColumn col = myDataView.Table.Columns["__Computed__Column__"];
if (col != null)
return;
col = new DataColumn("__Computed__Column__" + count.ToString());
myDataView.Table.Columns.Add(col);
col.Expression = value;
expressionColumn = col;
}
// override the OnPaint method to paint the cell based on the expression.
protected override void Paint(Graphics g, Rectangle bounds,
CurrencyManager source, int rowNum,
Brush backBrush, Brush foreBrush,
bool alignToRight)
{
bool trueExpression = false;
bool hasExpression = false;
DataRowView drv = source.List[rowNum] as DataRowView;
hasExpression = this.expressionColumn != null &&
this.expressionColumn.Expression != null &&
!this.expressionColumn.Expression.Equals(String.Empty);
Console.WriteLine(string.Format("hasExpressionValue {0}",hasExpression));
// Get the value from the expression column.
// For simplicity, we assume a True/False value for the
// expression column.
if (hasExpression)
{
object expr = drv.Row[expressionColumn.ColumnName];
trueExpression = expr.Equals("True");
}
// Let the DataGridBoolColumn do the painting.
if (!hasExpression)
base.Paint(g, bounds, source, rowNum,
backBrush, foreBrush, alignToRight);
// Paint using the expression color for true or false, as calculated.
if (trueExpression)
base.Paint(g, bounds, source, rowNum,
trueBrush, foreBrush, alignToRight);
else
base.Paint(g, bounds, source, rowNum,
falseBrush, foreBrush, alignToRight);
}
}
}
C# Windows Form中如何设置datagrid的各行颜色.
using System; ......
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
using System.Collections;
/*用法自定义dataGrid行颜色
* oleDbDataAdapter1.Fill(dataSet11,"学生");
DataGridTableStyle dgt = new DataGridTableStyle();
dgt.MappingName = "学生";
YKDataGridTextBoxColumn dgtbc = new YKDataGridTextBoxColumn();
dgtbc.MappingName = "姓名";
dgtbc.HeaderText= "NAME";
dgtbc.keyColumn=4;
dgtbc.mycolorList.Add(new YKColor(true,Color.Red,Color.Azure));
dgtbc.mycolorList.Add(new YKColor(false,Color.Blue,Color.Brown));
dgt.GridColumnStyles.Add(dgtbc);
dgtbc = new YKDataGridTextBoxColumn();
dgtbc.MappingName = "编号";
dgtbc.HeaderText= "id";
dgtbc.keyColumn=4;
dgtbc.mycolorList.Add(new YKColor(true,Color.Red,Color.Azure));
dgtbc.mycolorList.Add(new YKColor(false,Color.Blue,Color.Brown));
dgt.GridColumnStyles.Add(dgtbc);
DataGridBoolColumn db =
new DataGridBoolColumn();
db.HeaderText= "性别";
db.Width= 150;
db.MappingName = "性别";
dgt.GridColumnStyles.Add(db);
dataGrid1.TableStyles.Add(dgt);
*/
namespace YEKE
{
/// <summary>
/// YKDataGridTextBoxColumn 的摘要说明。
/// </summary>
public class YKColor:object
{
public object val;
public Color foreColor;
public Color backColor;
public YKColor(object v,Color forecolor,Color backcolor)
{
val=v;
foreColor=forecolor;
backColor=backcolor;
}
}
public class YKColorList
{
private ArrayList colorList;
public YKColorList()
{
colorList=new ArrayList();
}
public void Add(YKColor t)
{
colorList.Add(t);
}
public YKColor getColor(object v)
{
YKColor ykc=new YKColor(0,Color.Black,Color.White);
try
{
if(colorList.Count>0)
foreach(YKColor o in colorList )
{
if(o.val.Equals(v))
{
ykc.foreColor=o.foreColor;
ykc.backColor=o.backColor;
break;
}
}
}
catch
{}
return ykc;
}
}
public class YKDataGridTextBoxColumn : DataGridTextBoxColumn
{
public int keyColumn;
public YKColorList mycolorList;
public YKDataGridTextBoxColumn()
{
keyColumn=0;
mycolorList=new YKColorList();
}
protected override void Paint(Graphics g, Rectangle bounds,
CurrencyManager source, int rowNum,
Brush backBrush, Brush foreBrush,
bool alignToRight)
{
/**/ DataRowView drv = source.List[rowNum] as DataRowView;
object expr = drv.Row[keyColumn];
SolidBrush bb,fb;
YKColor ykc=mycolorList.getColor(expr);
bb=new SolidBrush(ykc.backColor);
fb=new SolidBrush(ykc.foreColor);
base.Paint(g, bounds, source, rowNum,
bb, fb, alignToRight);
}
}
public class YKDataGridBoolColumn : DataGridBoolColumn
{
private SolidBrush trueBrush = Brushes.Blue as SolidBrush;
private SolidBrush falseBrush = Brushes.Yellow as SolidBrush;
private DataColumn expressionColumn = null;
private static int count = 0;
public Color FalseColor
{
get
{
return falseBrush.Color;
}
set
{
falseBrush = new SolidBrush(value);
Invalidate();
}
}
public Color TrueColor
{
get
{
return trueBrush.Color;
}
set
{
trueBrush = new SolidBrush(value);
Invalidate();
}
}
public YKDataGridBoolColumn() : base ()
{
count ++;
}
// This will work only with a DataSet or DataTable.
// The code is not compatible with IBindingList implementations.
public string Expression
{
get
{
return this.expressionColumn == null ? String.Empty :
this.expressionColumn.Expression;
}
set
{
if (expressionColumn == null)
AddExpressionColumn(value);
else
expressionColumn.Expression = value;
if (expressionColumn != null &&
expressionColumn.Expression.Equals(value))
return;
Invalidate();
}
}
private void AddExpressionColumn(string value)
{
// Get the grid's data source. First check for a null
// table or data grid.
if (this.DataGridTableStyle == null ||
this.DataGridTableStyle.DataGrid == null)
return;
DataGrid myGrid = this.DataGridTableStyle.DataGrid;
DataView myDataView = ((CurrencyManager)
myGrid.BindingContext[myGrid.DataSource,
myGrid.DataMember]).List
as DataView;
// This works only with System.Data.DataTable.
if (myDataView == null)
return;
// If the user already added a column with the name
// then exit. Otherwise, add the column and set the
// expression to the value passed to this function.
DataColumn col = myDataView.Table.Columns["__Computed__Column__"];
if (col != null)
return;
col = new DataColumn("__Computed__Column__" + count.ToString());
myDataView.Table.Columns.Add(col);
col.Expression = value;
expressionColumn = col;
}
// override the OnPaint method to paint the cell based on the expression.
protected override void Paint(Graphics g, Rectangle bounds,
CurrencyManager source, int rowNum,
Brush backBrush, Brush foreBrush,
bool alignToRight)
{
bool trueExpression = false;
bool hasExpression = false;
DataRowView drv = source.List[rowNum] as DataRowView;
hasExpression = this.expressionColumn != null &&
this.expressionColumn.Expression != null &&
!this.expressionColumn.Expression.Equals(String.Empty);
Console.WriteLine(string.Format("hasExpressionValue {0}",hasExpression));
// Get the value from the expression column.
// For simplicity, we assume a True/False value for the
// expression column.
if (hasExpression)
{
object expr = drv.Row[expressionColumn.ColumnName];
trueExpression = expr.Equals("True");
}
// Let the DataGridBoolColumn do the painting.
if (!hasExpression)
base.Paint(g, bounds, source, rowNum,
backBrush, foreBrush, alignToRight);
// Paint using the expression color for true or false, as calculated.
if (trueExpression)
base.Paint(g, bounds, source, rowNum,
trueBrush, foreBrush, alignToRight);
else
base.Paint(g, bounds, source, rowNum,
falseBrush, foreBrush, alignToRight);
}
}
}