DataGridView是在用C#做windows界面程序时常用到的控件,DataGridView的功能非常多,用起来也非常复杂

例如
1. 我想在每行前面显示行编号,则需要先设置RowHeadersVisible为true,然后,在添加RowPostPaint事件,而RowPostPaint写起来也大同小异,这就非常没有必要.
期望一个DataGridView中,只要设置某个属性,这些都能自动做到
2. 为每一行添加一个checkbox是很多时候的基本要求,最好能在列的头部也有一个checkbox,选择它则所有行都被选中,取消它,则所有行都取消.而且,如果行选择模式(SelectionMode)是CellSelect,则选中选择框,行才可以被选择,
如果行选择模式(SelectionMode)是FullRowSelect,则选择任何一列,选中框都会响应.
实现起来也比较复杂,需要手动添加一个DataGridViewCheckBoxColumn,并且重新设置DataGridViewColumnHeaderCell.为DataGridViewColumnHeaderCell添加事件
这个也最好设置一个属性,这些功能能自动实现.
3. 设置一个DataGridView的显示列也比较麻烦,需要在设置界面中选中Columns,然后编辑列,这样太费劲,而且比较死板.这些显示信息,与逻辑没有任务关系,写成代码(即使是自动生成的),不是很合适.

借鉴做BS的经验,最好这些信息写成文本,可以减少代码量,修改起来也容易.甚至我可以在程序运行的时候,改变显示内容.
仔细思考一下,如果不是要求特别负责,则列只需要如下信息即可:
1) 列头显示文字
2) 列对应数据源中的属性或DataTable中的列名
3) 列的固定宽度或占整体宽度的百分比(整体宽度应该为DataGridView宽度-所有列的固定宽度)
4) 有些列最好隐藏,例如无意义的唯一标识,所以还需要列是否显示的相关信息
5) 列的对齐方式,靠左,靠右等.
这些信息可以使用JSON字符串配置.

  • 实现目标:

1: DataGridView的显示内容使用文本配置,不使用编码,可以简化编码.
2: 为DatgaGridView提供多选框,并且通过头部多选框可全选或全不选.
3: 为DataGridView提供行编号.

4: 设置为一个独立的类,而不要继承自DataGridView,不管使用者用不用这个实现类,使用者的界面最好都可以运行.

.

  • 接口

下面是我实现该类的主要接口:

 1 public sealed class DGViewHelper
 2 {
 3     /// <summary>
 4     /// 初始化控件
 5     /// </summary>
 6     /// <param name="form"></param>
 7     /// <param name="dgv"></param>
 8     /// <param name="json"></param>
 9     /// <param name="usingCheck">是否使用复选列</param>
10     /// <param name="usingNo">是否使用编号</param>
11     /// <returns></returns>
12     public bool Init(ContainerControl form, DataGridView dgv, string json, bool usingCheck = false, bool usingNo = false);
13 }

  • 演示代码

下面是该类的演示代码:

 1 public partial class ProcessMaterial : UserControl
 2 {
 3     DGViewHelper dgvHelper = new DGViewHelper();
 4
 5     private void ProcessMaterial_Load(object sender, EventArgs e)
 6     {
 7         dgvHelper.Init(this, dgvMaterial, ViewConfig.ViewDefault.ProcessMaterial_DGV, true, true);
 8
 9         // ...
10
11         DataTable dtMaterial = GetMaterials(type);
12         dgvMaterial.DataSource = dt;
13     }
14
15     string columnsInfo = "
16                   [
17                   {
18                   ""ColumnID"":""Name"",
19                   ""ColumnText"":""名称"",
20                   ""ColumnName"":""Name"",
21                   ""WidthPercent"":30,
22                   ""Align"":""left"",
23                   ""IsShow"":1
24                   },
25                   {
26                   ""ColumnID"":""Model"",
27                   ""ColumnText"":""型号"",
28                   ""ColumnName"":""Model"",
29                   ""WidthPercent"":30,
30                   ""Align"":""left"",
31                   ""IsShow"":1
32                   },
33                   {
34                   ""ColumnID"":""Count"",
35                   ""ColumnText"":""数量"",
36                   ""ColumnName"":""Count"",
37                   ""WidthPercent"":10,
38                   ""Align"":""left"",
39                   ""IsShow"":1
40                   },
41                   {
42                   ""ColumnID"":""Other"",
43                   ""ColumnText"":""操作"",
44                   ""ColumnName"":"""",
45                   ""WidthPercent"":30,
46                   ""Align"":""left"",
47                   ""IsShow"":1
48                   },
49                   {
50                   ""ColumnID"":""ProductID"",
51                   ""ColumnText"":"""",
52                   ""ColumnName"":""ProductID"",
53                   ""WidthPercent"":0,
54                   ""Align"":""center"",
55                   ""IsShow"":0
56                   },
57                   {
58                   ""ColumnID"":""ProcessId"",
59                   ""ColumnText"":"""",
60                   ""ColumnName"":""ProcessId"",
61                   ""WidthPercent"":0,
62                   ""Align"":""center"",
63                   ""IsShow"":0
64                   },
65                   {
66                   ""ColumnID"":""MaterialID"",
67                   ""ColumnText"":"""",
68                   ""ColumnName"":""MaterialID"",
69                   ""WidthPercent"":0,
70                   ""Align"":""center"",
71                   ""IsShow"":0
72                   }
73                   ]";
74 }

columnsInfo字符串需要解释一下,该字符串为一个JSON字符串,表示一个数组.数组中存储这DataBGridView要显示的列信息,包括:
ColumnID:列的唯一标识
ColumnText:列表头显示文字
ColumnName:列数据在DataSource对应的列或这属性
WidthPercent: 列占整个DataGridView宽度的百分比
Align:列对齐方式,left,right,center三种
IsShow:是否显示1实现,0隐藏

  • 演示界面

演示界面截图:

  • 相关代码

类源代码下载:

http://files.cnblogs.com/files/Rong-/DGViewHelper.zip

完整程序路径:

http://git.oschina.net/xumingxsh/HiCSClient

  • 遗留问题

1:DataGridView的列有很多的细节内容,在DGViewHelper中我只是对主要的内容进行了抽象,而且个人觉得80%的场景下,也不一定需要关注其他的列的细节内容.但是对列的抽象毕竟不完整,以后很可能会添加更多的列信息,例如当前采用百分比的列宽,以后可能会添加固定的列宽

2: 在DGViewHelper.cs中,DGVColumnInfo应该为一个外界不可见的DGViewHelper的内部类,但是由于无法进行JSON字符串转换,所以只能声明为public(internal还没有尝试)

转载于:https://www.cnblogs.com/Rong-/p/5412606.html

一个DataGridView辅助类相关推荐

  1. [Winform] DataGridView辅助类

    using System; using System.Collections.Generic; using System.Globalization; using System.Windows.For ...

  2. C# 为DataGridView的一个列加入DateTimePicker控件

    由于DataGridView自带的ColumnType里面没有DateTimePicker这个 控件 .所以要实现一个输入日期的列就比较麻烦了.通过以下方法可以往DataGridView加入DateT ...

  3. 为DataGridView的一个列加入DateTimePicker控件

    由于DataGridView自带的ColumnType里面没有DateTimePicker这个控件.所以要实现一个输入日期的列就比较麻烦了.通过以下方法可以往DataGridView加入DateTim ...

  4. JAVA多线程两个实用的辅助类(CountDownLatch和AtomicBoolean)

    AtomicBoolean它允许一个线程等待一个线程完成任务,然后运行: A boolean value that may be updated atomically. See the java.ut ...

  5. (伪)datagridview里面id的自增长

    今天碰到一个接口,做一个添加的,为了方便我就做了一个datagridview的点击触发,实现即时的修改保存和增加,为此发现有两个字段,其中一个就是id,我就想到了自增长,于是做了一个伪自增长,首先我去 ...

  6. 在DataGridView控件中加入ComboBox下拉列表框的实现

    原文 http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html 虽然在Visual Studio中 DataGridView控件的 ...

  7. DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态

    本文转载:http://www.cnblogs.com/Johnny_Z/archive/2012/02/12/2348235.html Winform中的DataGridView数据绑定控件有时会用 ...

  8. C#中实现一个TreeGridView(树形表格)附源码下载

    场景 效果 示例源码下载 https://download.csdn.net/download/badao_liumang_qizhi/11593399 实现 新建一个Winform程序,然后在页面上 ...

  9. C# Winform程序中DataGridView中使用ContextMenuStrip实现右键菜单

    场景 效果 实现 新建窗体程序,拖拽一个DataGridView控件. 然后点击控件右上角添加列. 然后拖拽一个ContextMenuStrip放到DataGridView上. 此时在左下角会显示Co ...

最新文章

  1. Zookeeper 安装和配置
  2. 【机器学习_4】机器学习算法分类
  3. ubuntu20.04 黑屏 进入不了图形界面 dev/sda1: clean
  4. django (三) admin后台系统
  5. Mysql 行前自动排序_mysql 取得行号后再排序
  6. Selenium with Python 006 - 操作浏览器
  7. day02:关于惯性导航工具箱的学习与使用:use of the progen
  8. surface 安卓双系统_一张图看懂微软Surface发布会:史上最大惊喜
  9. Codeforces 869C The Intriguing Obsession
  10. windowForm资料
  11. 身份证(省市)编码表
  12. day04,字典的操作
  13. 《WinForm开发系列之控件篇》Item2 BindingNavigator
  14. android mma
  15. 冒泡排序(Bubble Sort)
  16. Go微服务实战2:了解微服务
  17. 远场语音交互硬件声学性能测试标准
  18. love2d之路(一)环境配置
  19. 圆孔衍射夫琅禾费衍射matlab仿真
  20. genSIM 导入 txt 格式的词向量参数

热门文章

  1. Thinkphp 配置不用输入index.php
  2. Nginx的应用之虚拟主机
  3. 利用cookies跳过登陆验证码
  4. CodeForces 931C Laboratory Work 水题,构造
  5. 数据库日期时间显示在页面上格式错误的解决方案
  6. 如何使用Python脚本
  7. mysql批量生成修改表和列注释语句
  8. JavaScript 回调函数中的 return false 问题
  9. libev源码分析--常用的watcher
  10. css - clearfix-清除浮动