一个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;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发同事都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

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

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

学习笔记day5:inline inline-block block区别

1. block元素可以包含block元素和inline元素&#xff1b;但inline元素只能包含inline元素。要注意的是这个是个大概的说法&#xff0c;每个特定的元素能包含的元素也是特定的&#xff0c;所以具体到个别元素上&#xff0c;这条规律是不适用的。比如 P 元素&#xff0c;只能包含…

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

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

python的collection系列-默认字典(defaultdict)

默认字典&#xff0c;能定义默认值为其他类型 1 #dic1 {}2 #dic1["k1"].append("kkkkk") #正常情况会报错3 #print(dic1)4 5 import collections6 dic collections.defaultdict(list) #指定字典的值为列表7 dic["k1"].append("…

jquery获取java对象的属性_jQuery - 获得内容和属性

jQuery - 获得内容和属性jQuery 拥有可操作 HTML 元素和属性的强大方法。jQuery DOM 操作jQuery 中非常重要的部分&#xff0c;就是操作 DOM 的能力。jQuery 提供一系列与 DOM 相关的方法&#xff0c;这使访问和操作元素和属性变得很容易。提示&#xff1a;DOM Document Objec…

用border画三角形

<html> <head> <title>用border画三角形</title> <style>#one{width:0px;height:0px;margin:0 auto;border-top:50px solid white;border-right:50px solid white;border-bottom:50px solid orange;border-left:50px solid white;} </style&g…

iOS9适配(包括APNs)的改变

https://github.com/ChenYilong/iOS9AdaptationTips转载于:https://www.cnblogs.com/zkzzkz/p/5426658.html

javascript知识点记录(2)

1.js 异步加载和同步加载 异步加载模式也叫非阻塞模式&#xff0c;浏览器在下载js的同时&#xff0c;同时还会执行后续的页面处理&#xff0c; 在script标签内&#xff0c;用创建一个script元素&#xff0c;并插入到document中&#xff0c;这样就是异步加载js文件了 //以前的一…

java form的时间格式_SpringMvc接收日期表单提交,自动转换成Date类型方法

User中有birthday(Date)属性&#xff0c;用户注册的时候&#xff0c;选择日期即可&#xff0c;然后提交表单&#xff0c;可spring mvc 报错&#xff0c;400 Bad Request意思是不能把字符串转为Date类型的。实体类中加日期格式化注解DateTimeFormat(pattern "yyyy-MM-dd&q…

Groovy安装与入门实例

Groovy安装与入门实例 摘自: http://blog.csdn.net/dc_726/article/details/8576205 1 Groovy是什么&#xff1f; 来看下官网的介绍&#xff1a;http://groovy.codehaus.org Groovy... is an agile and dynamic language for the Java Virtual Machine builds upon the stren…

Ubuntu设置为命令行登录

rootubuntu:~# vi /etc/default/grub 改: 11 #GRUB_CMDLINE_LINUX_DEFAULT"quiet splash"12 GRUB_CMDLINE_LINUX_DEFAULT"quiet splash text" rootubuntu:~# update-grub rootubuntu:~# reboot 转载于:https://www.cnblogs.com/mylinux/p/5437543.html

java开发平台普元_java开发平台的两种实现模式

从目前国内主流的java开发平台看&#xff0c;主要有两种实现模式&#xff1a;引擎模式及生成源代码模式。引擎模式比较有代表性的是华丹平台(https://www.huadaninfo.com)&#xff0c;生成源代码模式比较有名是的普元平台(http://www.primeton.com)首先说一下引擎模式&#xff…

sde用户下使用sqlplus登录错误ORA-12547: TNS:lost contact

环境&#xff1a;linux oracle arcsde 解决&#xff1a;root用户下增加$ORACLE_HOME/bin/oracle文件的s权限[oraclelocalhost bin]$ chmod s oracle查看权限[oraclelocalhost bin]$ ls -al oracles权限参考 chmod s 可以给文件/目录 设置 suid和sgid转载于:https://www.cnblo…

java版本streamgobbler_java调用本地命令 Runtime class's exec() method

一个简单的定时调用dos命令的例子2,ExecJavac.java 带有异常处理的命令调用例子3,GoodWindowsExec.java 执行windows下的命令&#xff0c;命令作为参数输入StreamGobbler.java4,GoodWinRedirect.java 一个调用命令相对复杂的例子&#xff0c;复合命令StreamRedirectGobbler.jav…

Linux定时任务

最近在做一个SHELL脚本&#xff0c;要求每月1号执行一次。 不管是SHELL脚本&#xff0c;还是定时任务&#xff0c;都是刚接触。今天先记录下定时任务的解决过程&#xff0c;shell脚本的总结等测试无误后写出来。 root以及其他用户可以使用 crontab -e 命令添加定时任务 crontab…

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

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

CCTF部分赛题分析

这次算是跟着师傅们全程打完了CCTF的线上赛&#xff0c;一些强队的WriteUp也放了出来。这篇文章主要是想跟着大牛的思路把那些题重新再过一遍。 PWN3 这个是格式化字符串漏洞的题。printf的格式化串直接来自用户输入。 操作流程 用格式化字符串"%7$x"泄漏libc的地址。…

mediawiki mysql_MediaWiki

MediaWiki 最初是由科隆大学的学生及Magnus Manske这位程式开发员设计来编写维基百科的。50而当时是使用以Perl基础的UseModWiki(被维基社群加上外号为”Phase I”)&#xff0c;但後来於2002年1月25日转换至以PHP编写的新版本(”Phase Ⅱ”)。这个维基社群中是十分有名的&#…

20159206 《网络攻防实践》第九周学习总结

20159206《网络攻防实践》第九周学习总结 教材学习内容总结 本周我们学习了教材的第九章和第十章。 第九章介绍了恶意代码安全攻防。首先教材介绍了恶意代码的基础知识&#xff0c;恶意代码指的是使计算机按照攻击者的意图执行以达到恶意目的的指令集。恶意代码包括计算机病毒、…