• 一个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还没有尝试)

  • 相关阅读:
    Netty检查连接断开的几种方法
    docker部署RabbitMQ集群
    docker部署elk日志采集系统(kafka方式)
    docker部署elk日志采集系统(tcp方式)
    Chrome浏览器RCE 0Day漏洞PoC公开--漏洞复现
    LLMNR和NetBIOS欺骗--获取win7 ntlm-hash
    利用php配置文件构成后门
    zabbix 用sendEmail发邮件
    Exchange 2013 ecp中启用重置用户密码功能
    CentOS7下使用yum安装MariaDB
  • 原文地址:https://www.cnblogs.com/Rong-/p/5412606.html
Copyright © 2020-2023  润新知