TDataGridViewEx组件中设置单元格只读(ReadOnly)的.NET事件实现技术

(原创文章,转载请注明来源:http://blog.csdn.net/hulihui)

   前几天写了博文: TDataGridViewEx组件中设置行背景颜色的.NET事件实现技术,介绍了如何通过.NET的事件机制,设置DataGridView组件的单元格(行)的背景颜色。其实,这种方法可以推广。例如,本文探讨的设置单元格(行/列)只读(ReadOnly)。

    DataGridView的DataGridViewCell、DataGridViewColumn及其自身,均有ReadOnly属性,可以设置一个单元格或列/行只读,在增加列时就可以直接设置ReadOnly。但笔者认为,针对DataGridView,直接设置格/行/列对象的ReadOnly不灵活,特别是指定某些单元格(行/列)只读时。于是,考虑通过事件机制设置指定单元格的ReadOnly,即增加事件 exSetCellReadOnly。

    要解决的一个技术问题:如何捕获当前单元格(行/列)?经过比较,笔者重载了DataGridView的OnCellEnter事件,在该事件中判断应用程序是否订阅了exSetCellReadOnly 事件。步骤如下:
  1. 定义事件委托:TSetCellReadOnlyEvent
  2. 定义事件参数:TSetCellReadOnlyEventArgs
  3. 申明类型事件:exSetCellReadOnly
  4. 重载DataGridView的OnCellEnter
    下面是定制的事件委托、事件参数类型
  1.     public delegate void TSetCellReadOnlyEvent(object sender, TSetCellReadOnlyEventArgs e);
  2.     public class TSetCellReadOnlyEventArgs : EventArgs
  3.     {
  4.         private int m_RowIndex;
  5.         private int m_ColIndex;
  6.         private bool m_ReadOnly = false;

  7.         public TSetCellReadOnlyEventArgs(int row, int col)
  8.         {
  9.             m_RowIndex = row;
  10.             m_ColIndex = col;
  11.         }
  12.         public int RowIndex
  13.         {
  14.             get { return m_RowIndex; }
  15.         }
  16.         public int ColIndex
  17.         {
  18.             get { return m_ColIndex; }
  19.         }

  20.         public bool ReadOnly
  21.         {
  22.             get { return m_ReadOnly; }
  23.             set { m_ReadOnly = value; }
  24.         }
  25.     }
    下面是TDataGridViewEx中相关的代码(申明事件、激发事件、判断返回参数)
  1. public class TDataGridViewEx : DataGridView
  2. {        
  3.   [Description("Set a cell if readonly or not.")]
  4.   public event TSetCellReadOnlyEvent exSetCellReadOnly;  // 申明事件委托


  5.   /// <summary>
  6.   /// 进入单元格时, 判断是否为 ReadOnly
  7.   /// </summary>
  8.   protected override void OnCellEnter(DataGridViewCellEventArgs e)
  9.   {
  10.         if (this.exSetCellReadOnly != null)
  11.         {
  12.             TSetCellReadOnlyEventArgs ee = new TSetCellReadOnlyEventArgs(e.RowIndex, e.ColumnIndex);
  13.             this.exSetCellReadOnly(this, ee);


  14.             this.Rows[e.RowIndex].Cells[e.ColumnIndex].ReadOnly = ee.ReadOnly;  // 只要客户端订阅了SetReadOnly事件, 则总是设置当前进入单元的ReadOnly属性
  15.         }

  16.         base.OnCellEnter(e);
  17.     }
  18. }
    下面是窗体程序中的事件订阅代码
  1.   private void dataGridView1_exSetCellReadOnly(object sender, CSUST.Data.TSetCellReadOnlyEventArgs e)
  2.   {
  3.       if (e.ColIndex == 2 && e.RowIndex == 2)  // 单元格[2,2]只读
  4.       {
  5.           e.ReadOnly = true;
  6.       }
  7.       else if (e.RowIndex == 5)  // 行序号5为只读
  8.       {
  9.           e.ReadOnly = true;
  10.       }
  11.       else if (e.ColIndex == 0)  // 0列只读
  12.       {
  13.           e.ReadOnly = true;
  14.       }
  15.   }
    .NET中的委托与事件,给予类与其使用者(订阅者)相互通信的机制,掌握后可以灵活应用到类、组件设计中。本文就事件机制探讨其实现。事实上,可以直接在窗体程序中订阅 DataGridView 的 CellEnter 事件,直接设置 DataGridView 对象的单元格/行/列即可,也就是说本文内容是多余的。笔者最后也删除了 TDataGridViewEx 组件中的相关代码。

开发环境为vs2012 C#源码及完全样例 此版本为2012.2.24日更新版本,更新内容为 * 最后修改时间:2012.2.24 增加了汇总信息的自定义控制属性,参见功能描述12 * 2012.2.23 修改了过多列时父标题不显示的问题,重新写了算法,修改了标题头重叠及不能换行的问题,参见说明11. 总功能列举如下: /**************************************************************************************************** * Copyright (C) 2012 明振居士 版权没有,任意拷贝及使用,但对使用造成的任何后果不负任何责任,互相开源影响,共同进步 * 文 件 名:DataGridViewEx.cs * 创 建 人:明振居士 * Email:nzj.163@163.com qq:342155124 * 创建时间:2010-06-01 * 最后修改时间:2012.2.24 增加了汇总信息的自定义控制属性,参见功能描述12 * 2012.2.23 修改了过多列时父标题不显示的问题,重新写了算法,修改了标题头重叠及不能换行的问题,参见说明11. * 2012-1-19 增加第10条所示的功能;修改了列头超过26列的错误,导出excel为数组方式,速度更快,导出的单元格设置为文本格式。 * 标 题:用户自定义的DataGridView控件 * 功能描述:扩展DataGridView控件功能 * 扩展功能: * 1、搜索Search(); 有两个同明方法,参数不同 F3为快捷键继续向下搜索 * 2、用TreeView HeadSource 来设置复杂的标题样式,如果某个节点对应的显示列隐藏,请将该节点Tag设置为hide,隐藏列的排列位置与绑定数据元列位置对应,树叶节点的顺序需要与结果集的列顺序一致 * 3、通过反射导出Excel,无需引用com组件,方法ExportExcel() ,不受列数的限制,表头同样可以导出,AutoFit属性设置导出excel后是否自动调整单元格宽度 * 导出内容支持自定义的:Title List Header List Footer,支持在设计时值的设定,窗口关闭时Excel资源自动彻底释放 * 4、可以自己任意设定那些列显示及不显示,通过调用方法SetColumnVisible()实现。 * 5、设置列标题SetHeader(),设置列永远可见AlwaysShowCols(),设置列暂时不可见HideCols() * 注意,当使用了TreeView作为复杂Header时,不要使用本方法,Header显示的内容根据treeview内容而显示 * 6、列宽度及顺序的保存SaveGridView(),加载LoadGridView() * 7、支持所见即所得的打印功能,举例如下 * private void button5_Click(object sender, EventArgs e) { DGVPrinter printer = new DGVPrinter(); printer.PrintPreviewDataGridView(DataGridViewEx1); } * 8、自定义合并行与列,行合并用 MergeRowColumn 属性,列合并用MergeColumnNames属性,都可以定义多个列 * 9、行标号的设置 bool ShowRowNumber; * 10、增加最后一行的汇总行,支持列的聚合函数,参见http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.[removed]v=VS.100).aspx * 假设对id列显示“合计”字符,avgPrice进行平均值,total列显示合计,则对ComputeColumns属性增加三行内容:id,合计:;avgPrice,Avg(avgPrice);total,Sum(total) * 如果需要对值进行格式控制,请实现beforeShow事件 * 增加了导出和打印对应的支持,所见即所得的对齐方应用于式导出及打印。 * 11、列标题头自动换行,默认设置为每个列标题头行高为22,如果设置的字体更大,将自动进行计算。如果需要多行显示,请根据需要调节ColumnHeaderHeight属性值, * 其估算方法为预计的标题头层数乘以22,或层数乘以设置的字体高度。 * 12、针对第10条功能,增加汇总信息的自定义控制属性,汇总字体SummaryFont,汇总字体颜色SummaryFontColor,汇总背景色SummaryBGColor,边框与整个表格边框一致 ****************************************************************************************************/
*调整导出及打印的格式与显示一致;合计行,详细参见第10条修正功能,全部源码及示例。 * 文 件 名:DataGridViewEx.cs * 创 建 人:明振居士 * Email:nzj.163@163.com qq:342155124 * 创建时间:2010-06-01 * 最后修改时间:2012-1-19 增加第10条所示的功能;修改了列头超过26列的错误,导出excel为数组方式,速度更快,导出的单元格设置为文本格式。 * 标 题:用户自定义的DataGridView控件 * 功能描述:扩展DataGridView控件功能 * 扩展功能: * 1、搜索Search(); 有两个同明方法,参数不同 F3为快捷键继续向下搜索 * 2、用TreeView HeadSource 来设置复杂的标题样式,如果某个节点对应的显示列隐藏,请将该节点Tag设置为hide,隐藏列的排列位置与绑定数据元列位置对应,树叶节点的顺序需要与结果集的列顺序一致 * 3、通过反射导出Excel,无需引用com组件,方法ExportExcel() ,不受列数的限制,表头同样可以导出,AutoFit属性设置导出excel后是否自动调整单元格宽度 * 导出内容支持自定义的:Title List Header List Footer,支持在设计时值的设定,窗口关闭时Excel资源自动彻底释放 * 4、可以自己任意设定那些列显示及不显示,通过调用方法SetColumnVisible()实现。 * 5、设置列标题SetHeader(),设置列永远可见AlwaysShowCols(),设置列暂时不可见HideCols() * 注意,当使用了TreeView作为复杂Header时,不要使用本方法,Header显示的内容根据treeview内容而显示 * 6、列宽度及顺序的保存SaveGridView(),加载LoadGridView() * 7、支持所见即所得的打印功能,举例如下 * private void button5_Click(object sender, EventArgs e) { DGVPrinter printer = new DGVPrinter(); printer.PrintPreviewDataGridView(DataGridViewEx1); } * 8、自定义合并行与列,行合并用 MergeRowColumn 属性,列合并用MergeColumnNames属性,都可以定义多个列 * 9、行标号的设置 bool ShowRowNumber; * 10、增加最后一行的汇总行,支持列的聚合函数,参见http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.[removed]v=VS.100).aspx * 假设对id列显示“合计”字符,avgPrice进行平均值,total列显示合计,则对ComputeColumns增加三行内容:id,合计:;avgPrice,Avg(avgPrice);total,Sum(total) * 如果需要对值进行格式控制,请实现beforeShow事件 * 增加了导出和打印对应的支持,所见即所得的对齐方应用于式导出及打印。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值