一个DataGridView辅助类
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辅助类相关推荐
- [Winform] DataGridView辅助类
using System; using System.Collections.Generic; using System.Globalization; using System.Windows.For ...
- C# 为DataGridView的一个列加入DateTimePicker控件
由于DataGridView自带的ColumnType里面没有DateTimePicker这个 控件 .所以要实现一个输入日期的列就比较麻烦了.通过以下方法可以往DataGridView加入DateT ...
- 为DataGridView的一个列加入DateTimePicker控件
由于DataGridView自带的ColumnType里面没有DateTimePicker这个控件.所以要实现一个输入日期的列就比较麻烦了.通过以下方法可以往DataGridView加入DateTim ...
- JAVA多线程两个实用的辅助类(CountDownLatch和AtomicBoolean)
AtomicBoolean它允许一个线程等待一个线程完成任务,然后运行: A boolean value that may be updated atomically. See the java.ut ...
- (伪)datagridview里面id的自增长
今天碰到一个接口,做一个添加的,为了方便我就做了一个datagridview的点击触发,实现即时的修改保存和增加,为此发现有两个字段,其中一个就是id,我就想到了自增长,于是做了一个伪自增长,首先我去 ...
- 在DataGridView控件中加入ComboBox下拉列表框的实现
原文 http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html 虽然在Visual Studio中 DataGridView控件的 ...
- DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
本文转载:http://www.cnblogs.com/Johnny_Z/archive/2012/02/12/2348235.html Winform中的DataGridView数据绑定控件有时会用 ...
- C#中实现一个TreeGridView(树形表格)附源码下载
场景 效果 示例源码下载 https://download.csdn.net/download/badao_liumang_qizhi/11593399 实现 新建一个Winform程序,然后在页面上 ...
- C# Winform程序中DataGridView中使用ContextMenuStrip实现右键菜单
场景 效果 实现 新建窗体程序,拖拽一个DataGridView控件. 然后点击控件右上角添加列. 然后拖拽一个ContextMenuStrip放到DataGridView上. 此时在左下角会显示Co ...
最新文章
- Zookeeper 安装和配置
- 【机器学习_4】机器学习算法分类
- ubuntu20.04 黑屏 进入不了图形界面 dev/sda1: clean
- django (三) admin后台系统
- Mysql 行前自动排序_mysql 取得行号后再排序
- Selenium with Python 006 - 操作浏览器
- day02:关于惯性导航工具箱的学习与使用:use of the progen
- surface 安卓双系统_一张图看懂微软Surface发布会:史上最大惊喜
- Codeforces 869C The Intriguing Obsession
- windowForm资料
- 身份证(省市)编码表
- day04,字典的操作
- 《WinForm开发系列之控件篇》Item2 BindingNavigator
- android mma
- 冒泡排序(Bubble Sort)
- Go微服务实战2:了解微服务
- 远场语音交互硬件声学性能测试标准
- love2d之路(一)环境配置
- 圆孔衍射夫琅禾费衍射matlab仿真
- genSIM 导入 txt 格式的词向量参数