由于項目需要, 需要對DataGrid的數據行, 按不同的條件以不同的背景色相區別。 由于DataGrid中沒有相關的屬性和方法可以直接設置,要完成這個功能還挺費些功夫。在網上搜了半天,也沒找到解決方案。只好自己動手,豐衣足食了,:) 。研究了半天, 終于搞定它了。好東西不敢獨享,特貼出來,希望能給需要的人帶來些幫助。
{
//...
//使用DataGridTableStyle 顯示DataGrid.
DataGridTableStyle tableStyle = new DataGridTableStyle(); tableStyle.MappingName = "customers";
int numCols = _dataSet.Tables["customers"].Columns.Count; DataGridCellColorTextBoxColumn columnTextColumn ; for(int i = 0; i < numCols; ++i) { columnTextColumn = new DataGridCellColorTextBoxColumn(); columnTextColumn.HeaderText = _dataSet.Tables["customers"].Columns[i].ColumnName; columnTextColumn.MappingName = _dataSet.Tables["customers"].Columns[i].ColumnName;
//為每個單元格建立設置背景色的事件. columnTextColumn.CheckCellColor += new CellColorEventHandler(SetColorValues);
tableStyle.GridColumnStyles.Add(columnTextColumn); } dataGrid1.TableStyles.Clear(); dataGrid1.TableStyles.Add(tableStyle);
dataGrid1.DataSource = _dataSet.Tables["customers"];
}
public void SetColorValues(object sender, DataGridCellColorEventArgs e) { //根據條件, 將相關行設置不同的背景色. //下例為國家(datagrid中第9列)為Mexico的行設置為紅色,USA的行設為黃色. if(Convert.ToString(dataGrid1[e.Row,8]) == "Mexico") e.BackColor = Color.Red; else if(Convert.ToString(dataGrid1[e.Row,8]) == "USA") e.BackColor = Color.Yellow; }
public class DataGridCellColorEventArgs : EventArgs { private int _row; private Color _backcolor;
public DataGridCellColorEventArgs(int row, Color val) { _row = row; _backcolor = val; } public int Row { get{ return _row;} set{ _row = value;} } public Color BackColor { get{ return _backcolor;} set{ _backcolor = value;} } }
//為事件建立委托. public delegate void CellColorEventHandler(object sender, DataGridCellColorEventArgs e);
public class DataGridCellColorTextBoxColumn : DataGridTextBoxColumn { public event CellColorEventHandler CheckCellColor;
public DataGridCellColorTextBoxColumn() { }
//繼承DataGridTextBoxColumn的Pain事件. protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight) { if(CheckCellColor != null) { //重繪畫時,設置當前行的背景色 DataGridCellColorEventArgs e = new DataGridCellColorEventArgs(rowNum, Color.White); CheckCellColor(this, e); if(e.BackColor != Color.White) backBrush = new SolidBrush(e.BackColor); }
base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight); }
protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) { base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible); } }
|