设置DataGrid(WinForm)中行的背景色

 前一阵子在一个项目中用到了这个技巧,这是网上搜来的,感觉很不错

    {
        
//使用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;
    }

    
#region DataGridCellColor
    
public class DataGridCellColorEventArgs : EventArgs
    {
        
private int _row;
        
private Color _backcolor;

        
public DataGridCellColorEventArgs(int row, Color val)
        {
            _row 
= row;
            _backcolor 
= val;
        }
        
public int Row
        {
            
getreturn _row;}
            
set{ _row = value;}
        }
        
public Color BackColor
        {
            
getreturn _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);
        }
    }
    
#endregion
posted @ 2006-06-01 15:23  fullstar  阅读(814)  评论(0)    收藏  举报