蓝信子 发表于 2008-12-24 11:59:33

DataGrid 中由某列的值设定行的颜色

  为了实现.Net window DataGrid 的某一行可以根据该行某列的值的内容设定该行颜色的功能.
  
  先贴一个连接,里面有DataGrid很多功能扩充的解决方案Windows Forms Datagrid
  
  不过没有我这个需求的解决方案,最后终于还是在同事的帮助下搞定了.
  
  由某一个单元格的值设定该单元格的颜色的实现我就不贴了,上面的连接里面有解决方案.
  下面是由某列的值设定整行颜色的一个解决方案. 关键是在定制的DataGridTextBoxColumn里面添加一个DataView的属性,另外重载Paint() .
  在使用DataGridTextBoxColumn的时候,将DataGrid绑定的DataView赋值给它.
  
  public class public class DataGridColoredTextBoxColumn : DataGridTextBoxColumn
  {
  private System.Data.DataView m_bindDataView;
  public DataView BindingDataView
  {
  get
  {
  return m_bindDataView;
  }
  set
  {
  m_bindDataView = value;
  }
  }
  
  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)
  {
  // the idea is to conditionally set the foreBrush and/or backbrush
  // depending upon some crireria on the cell value
  // Here, we color anything that begins with a letter higher than 'F'
  try
  {
  //从DataView中取值,"ItemType"为行的名称
  string colValue = this.BindingDataView["ItemType"].ToString();
  char val = colValue;
  
  if( val > 'F' ) //如果首字母大于 'F'
  {
  backBrush = new SolidBrush(Color.BlueViolet );
  foreBrush = new SolidBrush(Color.White);
  }
  }
  catch(Exception ex)
  {
  //empty catch
  }
  finally
  {
  // make sure the base class gets called to do the drawing with
  // the possibly changed brushes
  base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
  }
  }
  
  }
  
  使用的例子
  DataGridColoredTextBoxColumn colExceptionType = new DataGridColoredTextBoxColumn();
  colItemType.BindingDataView = dtOrderItem.DefaultView; //将table的view赋值
  colItemType.HeaderText =“ItemType”;
  colItemType.MappingName = “ItemType“;
  colItemType.Width = 90;
  colItemType.NullText = "";
  tablestyle.GridColumnStyles.Add(colItemType);
  
   <
页: [1]
查看完整版本: DataGrid 中由某列的值设定行的颜色