一个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隐藏
- 演示界面
演示界面截图:
- 相关代码
类源代码下载:
https://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还没有尝试)
一个DataGridView辅助类的更多相关文章
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放
socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放
- C#里,如何模拟DataGridView里的一个Cell的Click事件。
//假设dgv是一个DataGridView. //我要点击第3行的第二个cell. //当然,要有一个点击事件.假设dgv_CellClick是那个点击事件. dgv_CellClick(dgv, ...
- 分享一个带有合计行功能的DataGridView扩展
因为一个Winform的项目中需要用到带有合计行的表格,并且需要满足以下需求: 合计行可自动对需要求和的列进行求和计算; 合计行必须固定(冻结)在表格的最底部,且其位置不受滚动条的滚动而移动; 可以设 ...
- Java的几个同步辅助类
Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...
- 同步辅助类CountDownLatch用法
CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则使当前线程处于等待状态,调用countDow ...
- 实现标记datagridview标题并导出Excel的功能
最近在学习winform,国庆前被布置了一个小任务,好不容易大致做出来了,决定记录下来,以此加深印象. 先说下需求:这是一个导入话单标记后并导出的功能 1. 选择excel文件 2. 定义字段 日 ...
- Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010
摘 要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...
- Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
(注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘 要:DataGridView控件作为数据传输的中介,只 ...
- DataGridView修改HeaderText
dataGridView_htList为一个 DataGridView(ht为HoverTree的缩写)方法一:dataGridView_htList.Columns["HtAddTime& ...
随机推荐
- 使用wxpython开发跨平台桌面应用,设计系统的登录界面
一般的系统登统界面,设计好看一些,系统会增色不少,而常规的桌面程序,包括Web上的很多界面,都借助于背景图片的效果来增色添彩,本篇随笔介绍基于WxPython来做一个登录界面效果,并对系统登录界面在不 ...
- 教育账号无法登录OneDrive的一种解决方法
众所周知,微软的服务总是能出现一些奇奇怪怪的问题,比如说教育账号无法登录OneDrive,尝试使用网上的临时解决方案失败 onedrive学生账号无法登录win10 OneDrive客户端 用户可以在 ...
- 记录一次C#爬虫记录,获取必应图片
记录一次C#爬虫记录,获取必应图片 起因 事情是这样的,我创建了一个仓库,里面有2018年到目前为止每日的必应壁纸,在八月份的时候我看到微软有接口文档,于是写了一个服务,每天早上八点钟会获取必应壁纸( ...
- C#和sql 中的 四舍五入向下向上取整
c#四舍五入取整 Math.Round(3.45, 0, MidpointRounding.AwayFromZero) 上取整或下取整 Math.Ceiling(3.1)=4; Math.Floor( ...
- vue使用高德地图Amap未定义问题
// 引入高德地图 import VueAMap from 'vue-amap'; Vue.use(VueAMap); // 初始化vue-amap VueAMap.initAMapApiLoader ...
- Ant Design Pro项目一初始化就报a标签嵌套a标签错误<a> cannot as a descendant of <a>
前情 公司经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 坑位 按官方文挡一步步下来,项 ...
- \r,\n,\r\n的前世今生
前情 最近在逛论坛的时候遇到有人在提问题,为什么\n在苹果手机上不换行,我以前有网上看到过文章,是因为各系统的解析不同,需要使用\r\n来做兼容,自己虽然知道怎么解决,但是不知具体原因,今特来详细了解 ...
- Redis应用—3.在购物车里的应用
大纲 1.社区电商购物车的读多写多场景分析 2.购物车的复杂缓存与异步落库(Sorted Set + Hash -> hPut + zadd) 3.购物车异步落库与完整加入流程(缓存雪崩 + M ...
- IOS颜色选择器
IOS颜色选择器 UIColorWell UIColorWell是一个继承UIControl的视图,它不能调整大小和UISwitch类似,大小大约是44*44.点击可弹出一个选择颜色的弹窗 因为是继承 ...
- zz Spring 是一种反模式
Java 将会消亡 – Martin Vysny – 第一性原理思考 原文标题"Java 将会消亡", 我并不认可 Java 会消亡一说, 作者还处于 FP 亢奋期,而我已经从 F ...