定制 WinForm DataGrid单元格格式

转载 2006年06月10日 07:58:00
以前都是在.asp.net下开发程序,前段时间做一个winform项目,里面用到datagrid,要求datagrid中的每行的单元格式需要根据不同的要求显示不同的颜色,本来想通过设置datagrid的一些属性就可以搞定了,后来发现没有这么简单,要达到要求就需要重新实现DataGridColumnStyle 抽象类了,微软为DataGridColumnStyle 提供了一个实现子类为DataGridTextBoxColumn ,在DataGridTextBoxColumn 基础上来重写Paint(Graphics g, Rectangle bounds , CurrencyManager source , int rowNum, Brush backBrush ,    Brush foreBrush , bool alignToRight )方法来到达我们的要求.

using System;
using System.Windows.Forms;
using System.Collections;
using System.Drawing;
namespace LQF.RainVersionReceiver.WinUI
{
 /// <summary>
 /// GridColoredTextBoxColumn 的摘要说明。
 ///
 /// 定制DataGrid单元格样式
 /// </summary>
 [System.ComponentModel.DesignerCategory("Code")]
 public class GridColoredTextBoxColumn:DataGridTextBoxColumn
 {  
       
  /// <summary>
  /// 用于存放单元格背景色
  /// </summary>
  private System.Drawing.Color BackColor;

  
  /// <summary>
  /// 用于存放单元格前景色
  /// </summary>
  /// <returns></returns>
  private System.Drawing.Color ForeColor;

       
  /// <summary>
  /// 单元格值显示格式接口
  /// </summary>
  private IGridTextBoxColumnValue cellvalue=null;

  /// <summary>
  /// 单元格值显示格式
  /// </summary>
  /// <param name="icellvalue"> 单元格内容显示格式类</param>
  /// <param name="forecolor"> 单元格的前景色</param>
  /// <param name="backcolor"> 单元格的背景色</param>
  public GridColoredTextBoxColumn(IGridTextBoxColumnValue icellvalue,System.Drawing.Color forecolor,System.Drawing.Color backcolor)
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //

   this.cellvalue=icellvalue;
   this.ForeColor=forecolor;
   this.BackColor =backcolor;
  }


  protected override void Paint(Graphics g, Rectangle bounds ,
   CurrencyManager source , int rowNum, Brush backBrush ,
   Brush foreBrush , bool alignToRight )
  
  {  
   string text=string.Empty;

   //模式重绘
   if (cellvalue!=null)
   {
    text = cellvalue.GetDisplayText(GetColumnValueAtRow(source, rowNum)); /没有提供格式化实例,/默认取单元格数据
   }
   else
   {
    text = GetColumnValueAtRow(source, rowNum).ToString(); //按格式化类实现的格式取单元格数据,                
   }

   backBrush = new SolidBrush(TextBox.BackColor); //背景色

   foreBrush = new SolidBrush(TextBox.ForeColor); //前景色

  
   backBrush = new SolidBrush((Color)BackColor);
   foreBrush = new SolidBrush((Color)ForeColor);
   
   base.PaintText(g, bounds, text, backBrush, foreBrush, alignToRight);
  }
  
 }
   
 /// <summary>
 /// 单元格内容显示格式接口,可根据单元格不同的显示格式要求实现其子类
 /// </summary>
 public interface IGridTextBoxColumnValue
 {
       /// <summary>
       /// 按子类实现的格式返回单元格内容
       /// </summary>
       /// <param name="val">单元格值</param>
       /// <returns>单元格值格式化后显示的文本</returns>
  string GetDisplayText(object val);
 }

    /// <summary>
    /// 单元格内容显示格式类
    /// </summary>
 public class GridTextBoxColumnValue:IGridTextBoxColumnValue
 {
  
  /// <summary>
  /// 按子类实现的格式返回单元格内容
  /// </summary>
  /// <param name="val">单元格值</param>
  /// <returns>单元格值格式化后显示的文本</returns>
  public string GetDisplayText(object val)
  {  
   string ret=val.ToString();
   
   //空值显示格式
   if  (val is DBNull)
   {
                 ret= "-" ;
   }

            //时间显示格式
   if  (val is System.DateTime)
   {

    ret= ((System.DateTime)val).ToString("HH:mm:ss");
   }
           
   //零值显示格式
   if  (val is System.String)
   {
 
    if ((string)val=="0" || (string)val=="0.0" || (string)val=="0.00") ret ="-";
   }

   return ret;
   
       
  }
 }

}

在winform中调用示例:

DataGridTableStyle ts1 = new DataGridTableStyle();
   ts1.MappingName ="交费表";

   ts1.HeaderBackColor=Color.Black;
   ts1.HeaderForeColor=Color.Red;
   ts1.HeaderFont= new System.Drawing.Font("宋体",
                                                     12F,
                                                     System.Drawing.FontStyle.Regular,
                                                     System.Drawing.GraphicsUnit.Point,
                                                     ((System.Byte)(0)));

   ts1.SelectionBackColor=Color.Black;
   ts1.SelectionForeColor=Color.Red;

   ts1.AlternatingBackColor = Color.Black ;
          
   ts1.GridLineColor=Color.Red;
   

            ts1.BackColor=Color.Black;
   ts1.ForeColor=Color.Yellow ;
   ts1.AllowSorting=false;
            
    GridTextBoxColumnValue text=new GridTextBoxColumnValue();  //实例化一个格式化子类

   DataGridColumnStyle TextCol = new GridColoredTextBoxColumn(text,System.Drawing.Color.Yellow,System.Drawing.Color.Black);
   TextCol.MappingName = "code"

   TextCol.HeaderText = " 代 码";
   TextCol.Width = 58;
   TextCol.ReadOnly=true;
   ts1.GridColumnStyles.Add(TextCol);
     
   // Add a second column style.
   TextCol = new GridColoredTextBoxColumn(text,System.Drawing.Color.Yellow ,System.Drawing.Color.Black);
   TextCol.MappingName = "name"   

   TextCol.HeaderText = " 名 称 ";
   TextCol.Width = 100;
   TextCol.ReadOnly=true;
   ts1.GridColumnStyles.Add(TextCol);

   // Add a second column style.
   TextCol = new GridColoredTextBoxColumn(text,System.Drawing.Color.Red  ,System.Drawing.Color.Black);
   TextCol.MappingName = "new_price";
   TextCol.HeaderText = "价 格 ";
   TextCol.Width = 68;
   TextCol.ReadOnly=true;
   ts1.GridColumnStyles.Add(TextCol);

   // Add a second column style.
   TextCol =new GridColoredTextBoxColumn(text,System.Drawing.Color.Tomato ,System.Drawing.Color.Black);
   TextCol.MappingName ="makup" ;

    TextCol.HeaderText = " 涨 幅% ";
   TextCol.Width =68;
   TextCol.ReadOnly=true;
   ts1.GridColumnStyles.Add(TextCol);

   // Add a second column style.
   TextCol =new GridColoredTextBoxColumn(text,System.Drawing.Color.GreenYellow ,System.Drawing.Color.Black);
   TextCol.MappingName ="amount";
   TextCol.HeaderText = "     金 额    ";
   TextCol.Width = 180;
   TextCol.ReadOnly=true;
   ts1.GridColumnStyles.Add(TextCol);

   // Add a second column style.
   TextCol = new GridColoredTextBoxColumn(text,System.Drawing.Color.Turquoise ,System.Drawing.Color.Black);
   TextCol.MappingName = "recordtime";
   TextCol.HeaderText = " 时间 ";
   TextCol.Width =100;
   TextCol.ReadOnly=true;
   ts1.GridColumnStyles.Add(TextCol);

   
   /* Use a PropertyDescriptor to create a formatted
   column. First get the PropertyDescriptorCollection
   for the data source and data member. */
   //   PropertyDescriptorCollection pcol = this.BindingContext
   //    [myDataSet, "Customers.custToOrders"].GetItemProperties();
   //
   //   /* Create a formatted column using a PropertyDescriptor.
   //   The formatting character "c" specifies a currency format. */    
   //   DataGridColumnStyle csOrderAmount =
   //    new DataGridTextBoxColumn(pcol["OrderAmount"], "c", true);
   //   csOrderAmount.MappingName = "OrderAmount";
   //   csOrderAmount.HeaderText = "Total";
   //   csOrderAmount.Width = 100;
   //   ts2.GridColumnStyles.Add(csOrderAmount);

   /* Add the DataGridTableStyle instances to
   the GridTableStylesCollection. */
   this.gridList.TableStyles.Add(ts1);
   this.gridList.Font =new System.Drawing.Font("宋体",
    12F,
    System.Drawing.FontStyle.Regular,
    System.Drawing.GraphicsUnit.Point,
    ((System.Byte)(0)));
   
   this.gridList.BackgroundColor=Color.Black;
   this.gridList.CaptionBackColor=Color.Black;
   

   this.gridList.ParentRowsBackColor=Color.Black;
   this.gridList.ParentRowsForeColor=Color.Red;

在 winform 中 DataGrid 中实现点击任一单元格都选中当前行

在 winform 中 DataGrid 中实现点击任一单元格都选中当前行先需要重写一个方法:C#:    internal class DataGridNoActiveCellColumn : Sy...
  • letian_fly
  • letian_fly
  • 2008年06月17日 18:07
  • 1132

DataGrid单元格数据输入格式检测方法

public int nPreX = -1;//初始化位置变量Xpublic int nPreY = -1;//初始化位置变量Yprivate bool bChangeCell = true;//标志...
  • brucenan999
  • brucenan999
  • 2004年12月15日 14:33
  • 807

C# datagridview 实现单元格内容进行回车换行而不是换另一行数据

自带的换行是shift+enter但客户偏偏想要enter换行,无耐百度了好久才搜到这一篇文章。稍加改动就可实现自己的功能 运行效果截图(原始) 运行效果截图(...
  • shenshendeai
  • shenshendeai
  • 2017年08月12日 14:58
  • 821

DataGridColoredTextBoxColumn 改变datagrid 某一特定单元格颜色

 public class  DataGridColoredTextBoxColumn : DataGridTextBoxColumn {   private System.Data.DataRow[...
  • xinhongmei
  • xinhongmei
  • 2007年04月18日 13:52
  • 973

改变datagrid的样式

///   /// 设置Datagrid的列样式  ///   /// System.Data.DataTable  /// DataGrid  static public  void SetGrid...
  • serversql
  • serversql
  • 2006年03月28日 13:54
  • 1844

easy-ui之datagrid 单元格样式设置

问题描述:单元格的格式为:只读、点击无光标、背景色为灰色 解决方法: var editors = $("#invoiceDetailDatagrid").datagrid('getEdi...
  • dongmenshiyu
  • dongmenshiyu
  • 2016年05月06日 16:26
  • 2892

(原创)easyui前台改变datagrid某单元格的值

有时候前台完成某个操作后要修改datagrid的值, 也许这个datagrid是没有保存的, 所以要修改后才能传递到后台; 也许要其他操作过后才需请求后台; 这些情况都需要前台对datagri...
  • d7011800
  • d7011800
  • 2013年03月19日 17:00
  • 53393

easyui-datagrid 编辑单元格

在做itoo成绩的时候,有个需求是教师判分,学生成绩有两部分组成:平时成绩和期末成绩,然后根据两种成绩比例算出总成绩。现在是有了平时成绩和成绩比例,输入期末成绩,计算出总成绩,并且把输入的期末成绩和计...
  • u011458469
  • u011458469
  • 2016年03月30日 20:31
  • 9904

在 winform 中的 datagrid 中实现单元格双击事件

在 winform 中的 datagrid 中实现单元格双击事件Public Class Member1Class Member1    Inherits System.Windows.Forms.F...
  • letian_fly
  • letian_fly
  • 2008年06月17日 18:09
  • 1400

C#DataGridView 单位格文本主动换行(补充)

今天再用C# DataGridView展示数据时,因担心展示的数据过长,于是想让单元格自动进行换行。 在网上搜了许多的资料,有的说可以有的说不可以,大致方法为: 设置RowDefaultCellS...
  • xiaomen417
  • xiaomen417
  • 2016年12月21日 10:59
  • 1146
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:定制 WinForm DataGrid单元格格式
举报原因:
原因补充:

(最多只允许输入30个字)