一个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)

接着上篇了解一下java压缩实现过程&#xff0c;下面的是支持 单文件 或 文件夹 压缩的实现&#xff0c;使用递归。效果&#xff1a;代码&#xff1a;package com.gx.compress;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;imp…

java处理中文字符串_Java实现读取文章中重复出现的中文字符串

在上个星期阿里巴巴一面的时候&#xff0c;最后面试官问我如何把一篇文章中重复出现的词或者句子找出来&#xff0c;当时太紧张&#xff0c;答的不是很好。今天有时间再来亲手实现一遍。其实说白了也就是字符串的处理&#xff0c;所以难度并不是很大。以下是代码和运行效果&…

java长连接转短连接_java原生程序redis连接(连接池/长连接和短连接)选择问题...

原标题&#xff1a;java原生程序redis连接(连接池/长连接和短连接)选择问题最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接&#xff0c;以及连接池和单连接等问题用几篇博客来总结下。这个问题的具体发生在java原生程序和redis的交互中。这个问题对我最…

mysql 操作xm_mysql基本命令使用

启动mysql>net start mysql连接mysql>mysql -u root -h 127.0.0.1 -p password断开mysql连接>qult;查看mysql服务器所有数据库列表>show databases;选择mysql数据库>use database_name;创建数据库>create database database_name;删除数据库>drop databas…

mysql集群重启报错lock_CentOS7.2 下 MySQL 之 PXC 集群部署【Docker+单机多节点】

背景【注意】: 鄙人认为本篇适合做入门测试/学习之用&#xff0c;选择的 "单机多节点配置"&#xff0c;后面再整理 "多机配置"文章.近期正突击学习数据库知识想着对 PXC 集群部署实际操作一番&#xff0c;提高技能点&#xff0c;为后续的升职加薪做充足的准…

Fragment销毁时replace和add两个方法的区别

这个首先从一个bug说起&#xff0c;如图: 我们都知道fragment切换有两种方式&#xff1a; 1. replace方式 transaction.replace(R.id.content, IndexFragment); 2. add&#xff0d;hide&#xff0d;show方式 transaction.add(R.id.content, IndexFragment); transaction.hide(…

子集生成 --二进制法

用二进制表示{0,1,2,3...n-1}的子集s&#xff1b;从右往左第i位表示元素i是否在集合s中。图2表示10100110是如何展示了集合{1,2,5,7}的。 注意&#xff1a;为了方便&#xff0c;最右边的为总是对应元素0&#xff0c;而不是元素1&#xff1b; 异或最重要的性质就是开关型---异或…

20150303+JQuery选择器-02

20150303JQuery选择器-02 三、文档处理 插入 删除 复制 替换 包裹 查找 1、插入操作——内部插入 jQuery <div> jQuery hello jQuery</div> l append(content) &#xff1a;将content内容插入到元素的尾部 l appendTo(content) &#xff1a;将匹配到的元素插入到co…

java实现记事本查找_Java实现记事本

首先说明&#xff0c;这是可能本人大学所写的最后一个Java程序了&#xff0c;接下来写C。一直想写这个程序很久了&#xff0c;作为跟计算器类似的经典小程序&#xff0c;写一下还是挺有意义的。本来觉得这程序不难写&#xff0c;其实各个部分综合起来&#xff0c;还是挺麻烦的&…

机器学习 —— 概率图模型(Homework: CRF Learning)

概率图模型的作业越往后变得越来越有趣了。当然&#xff0c;难度也是指数级别的上涨啊&#xff0c;以至于我用了两个周末才完成秋名山神秘车牌的寻找&#xff0c;啊不&#xff0c;CRF模型的训练。 条件随机场是一种强大的PGM&#xff0c;其可以对各种特征进行建模&#xff0c;同…

java生成四则运算表达式_生成四则运算(java实现)

|博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ ||作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376||作业目标 | 写一个能自动生成小学四则运算题目的程序 ||学号 | 3190704130 |代码如下&#xff1a;//main函数所在区域主要实现生成…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(三)

钓鱼邮件 当攻击者制作了钓鱼网站、木马程序后&#xff0c;便会想法设法将其传给受害者&#xff0c;而常见的传播方式便是钓鱼网站了。安全意识较差的用户在收到钓鱼邮件后点击邮件中的钓鱼链接、下载附件中的木马程序&#xff0c;便可能遭受攻击&#xff01; 工具简介 Swak…

struts2拦截器详解

在之前的文章中&#xff0c;我们已经涉及到了拦截器&#xff08;Interceptor&#xff09;的概念。 downpour 写道拦截器是AOP中的概念&#xff0c;它本身是一段代码&#xff0c;可以通过定义“织入点”&#xff0c;来指定拦截器的代码在“织入点”的前后执行&#xff0c;从而起…

为什么选用 React 创建混合型移动应用?

【编者按】本文作者为 14islands 联合创始人、创新 Web 开发者 David Lindkvist&#xff0c;主要介绍有关混合型应用搭建的方方面面。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 最近&#xff0c;我们有幸与 Fjord 合作&#xff0c;从零开始为其用户打造了一款 HMTL5 混合型应…

python中减法运算函数_OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减...

OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比? ? 前往老猿Python博文目录 ?在《OpenCV-Python图像的加法运算cv2.add函数详解》详细介绍了图像的加法运算&#xff0c;有加法就有减…

数据访问......单条件查询与多条件查询

一. 将数据库数据访问封装成类 <?php class DB {public $host "localhost"; //服务器地址public $uid "root"; //用户名public $pwd "123"; //密码//执行SQL语句,返回相应结果的方法//$sql代表要执行的SQL语句,$type代表…

java集合类分析-hashset

一、 HashSet概述&#xff1a; HashSet实现Set接口&#xff0c;由哈希表&#xff08;实际上是一个HashMap实例&#xff09;支持。它不保证set 的迭代顺序&#xff1b;特别是它不保证该顺序恒久不变。此类允许使用null元素。 二、 HashSet的实现&#xff1a; 对于HashSet而言&…

站立会议 2

这是我们的第二次人员集中&#xff0c;主要是讨论一下接下来的一些工作安排&#xff0c;还有讨论一下在准备过程中出现的一些问题&#xff01; 项目进展&#xff1a; 今天的会议中&#xff0c;我们讨论了我们的项目进展&#xff0c;结果是&#xff1a;我们都已经找到了小球还有…

转为win64后, MS的lib问题

> 正在创建库 C:\Users\Administrator\Desktop\branch-Unicode-156\\Temp\Link\PointCloudMeasure\x64\Debug\PointCloudMeasure.lib 和对象 C:\Users\Administrator\Desktop\branch-Unicode-156\\Temp\Link\PointCloudMeasure\x64\Debug\PointCloudMeasure.exp1>vtkXM…

php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

许多网站都有排行榜的功能&#xff0c;比如球员人气榜单、阅读排行榜&#xff0c;对于一些小网站&#xff0c;通过查数据库就能实现排行榜的功能&#xff0c;但是对于稍微有点用户量而且还是实时排名的网站&#xff0c;使用一些关系型数据库如(MySQL、Oracle)等来实现就有点力不…