zoukankan      html  css  js  c++  java
  • 关于Winform下DataGridView中实现checkbox全选反选、同步列表项的处理

    近期接手一个winform 项目,虽然之前有.net 的经验,但是对一些控件的用法还不是很熟悉。 这段时间将会记录一些在工作中遇到的坎坷以及对应的解决办法,写出来与大家分享并希望大神提出更好解决方法来促进进步。 我也会尽可能把我查找到资料的出处引出来,以此来感恩对我提供帮助的人们。

    正题如下

    一、关于Winform下DataGridView中实现checkbox全选反选、同步列表项的处理

    1.checkbox的添加:在设计页面选择编辑列在新添加的列中注意如下几个属性:

    SortMode = NotSortable :禁止排序,点击表头进行全选/反选时 和排序事件是无关的,虽然不会有质的影响,但是我还是禁止了

    ColumnType = DataGridViewCheckBoxColumn:这就是核心点了 设置列的属性为复选框

    DataPropertyName = iChecked : 这个又是一个建议的选择,最好有字段与之对应,这样开发起来更加方便

    HeaderText = □:这是我一个投机取巧的方式,如果在表头添加复选框对后续的开发带来很多麻烦,所以这里用□代表反选 √代表全选

    2.DataGridView相关属性的设置:

    //使显示的列和空间中设定的列一致,否则会按照dataTable中的列显示
    dgv.AutoGenerateColumns = false;
     //不添加此语句 会多出一列
    dgv.AllowUserToAddRows = false;

    3.全选/反选核心代码

    添加ColumnHeaderMouseClick 事件

    核心代码如下

    if (e.ColumnIndex == 0)
                {
                    dgv.ClearSelection();
                    dgv.CurrentCell = dgv[1, 0];//如果没有这句代码,如果复选框列有某个单元格获得焦点时,虽然全选,但是此单元格依然不能选中 这句话的意思就是把焦点移出去
                    if (ck.HeaderText == "□")
                    {
                        for (int i = 0; i < dgv.RowCount; i++)
                        {
                            dgv.Rows[i].Cells[0].Value = true;
                        }
                        ck.HeaderText = "√";
                    }
                    else
                    {
                        for (int i = 0; i < dgv.RowCount; i++)
                        {
                            dgv.Rows[i].Cells[0].Value = false;
                        }
                        ck.HeaderText = "□";
                    }
                }

    4.列表中的复选框处罚表头的改变处理方式及核心代码

    添加CellContentClick事件 至于为什么添加这个事件,网上有很多文章描述,我不必在此细说

    if (e.ColumnIndex == 0 && e.RowIndex != -1)
                {
                    int sum = 0;
                    for (int i = 0; i < dgv.RowCount; i++)
                    {
                        //必须使用这个属性 EditedFormattedValue 这个属性也是关键 这里不用value是因为不是实时的数据   网上更多详细资料如果想深入研究可以自己查资料
                        if ((bool)dgv.Rows[i].Cells[0].EditedFormattedValue)
                        {
                            sum++;
                        }
                    }
                    if (sum == dgv.RowCount)
                    {
                        ck.HeaderText = "√";
                    }
                    else
                    {
                        ck.HeaderText = "□";
                    }
                }

    相关参考文章:

    https://www.cnblogs.com/emanlee/archive/2009/07/21/1528074.html

    https://www.cnblogs.com/chaobaojun/archive/2010/05/13/1734509.html

  • 相关阅读:
    linux命令查询网站
    UTC(世界协调时间)时区和各个时区时间的转换
    dev-c++ 中写完源文件生成exe程序怎么避免运行闪退?
    numpy和time计时程序
    进化算法之粒子群算法和Matlab实现(多维)
    tf.config:GPU 的使用与分配(转载)
    限制TensorFlow只在CPU上运行的方法
    Python重要学习链接
    SpringCloud 之 Nacos 注册配置中心
    Jenkins 自动化部署入门详细教程
  • 原文地址:https://www.cnblogs.com/lsmhome/p/9019301.html
Copyright © 2011-2022 走看看