您的位置:首页 > 编程语言 > C#

C# Windows Form中如何设置datagrid的各行颜色.

2004-12-10 23:35 288 查看
摘自 中国.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
4000
 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);
      }
   }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息