关于winform下datagridview中实现checkbox全选反选同步列表项的处理

神马小猿 神马小猿     2022-11-11     311

关键词:

近期接手一个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

c#winform下datagridview单元按钮列

参考技术A  在C#WinForm下做过项目的朋友都知道其中的DataGridView控件默认只支持DataGridViewButtonColumnDataGridViewCheckBoxColumnDataGridViewComboBoxColumnDataGridViewImageColumnDataGridViewLinkColumn和DataGridViewTextBoxColumn六种列类型如果你想要在DataGridView... 查看详情

c#winform关于listview控件绑定datatable

...程中实现绑定控件的column的属性,再进行item的绑定。与DataGridView不同的是,不能直接使用DataSourse绑定,再者,绑定第一个Items的时候一定要实例化一个Item进行单独绑定,因为第一个Item与后面的不用即Item与SubItem的区别,下面的... 查看详情

在datagridview控件中实现冻结列分界线

...上一条明显的黑线。如下图:  (图1)WinForm下的DataGridView控件也能实现类似的冻结行或者列的功能(参见:http://msdn.microsoft.com/zh-cn/library/28e9w2e1(VS.85).aspx) , 查看详情

如何在 DataGridView 控件中实现级联组合框?

】如何在DataGridView控件中实现级联组合框?【英文标题】:HowtoimplementcascadingComboBoxesinDataGridViewcontrol?【发布时间】:2014-01-0720:35:41【问题描述】:我需要在几个DataGridViews中实现级联ComboBoxes。作为概念证明,我将下面的代码放在... 查看详情

关于winform下datagridview控件行的选择的问题

我在DataGridView1控件中显示考题的信息,双击某一行考题后可以将这行考题添加到DataGridView2,考题有分类QuestionsType字段,我想在选择了QuestionsType的值是A的考题后,设置QuestionsType的值为B的考题都为不可选考题,有什么办法可以... 查看详情

一个winform下datagridview控件外观的自定义类

一、关于起因最近非常频繁的使用DataGridView控件,VS提供的Winform下DataGridView的默认样式非常难看。如果做美化处理的话,需要调整的地方非常多,且该控件的很多设置属性非常的晦涩,不是很人性化。每次进行设置都煞费脑筋,... 查看详情

C# WinForms。在组件中实现属性“名称”

】C#WinForms。在组件中实现属性“名称”【英文标题】:C#WinForms.Implementingtheproperty"Name"inthecomponent【发布时间】:2018-02-2521:04:42【问题描述】:我想在Component中实现属性Name,它的值与指向组件的表单中的字段名称相同。pri... 查看详情

在winform界面菜单中实现动态增加最近使用的文件菜单项

...辑过的文件,这种在很多软件上很常见,本文主要介绍在Winform界面菜单中实现【最近使用的文件】动态菜单的处理,实现一个较为常用的功能。在我上篇随笔《文字处理控件TXTextControl的使用》介绍的内容中,我针对性的对这个... 查看详情

winform关于datagridview复选框的问题

跟据combox的选择下面DataGridView加载相应的数据但是复选框在开始时会根据数据库里的一个值默认是选中还是不选中第一个图是开始加载时的情况他不会有默认但是combox的选择改变的话会有怎么解决才能让他有默认选中的在onLoad事... 查看详情

关于vb.net2005中datagridview的问题

在dataGridView中双击某一行数据弹出另一个页面对这条数据进行修改,修改完毕后点保存返回原来的页面并对原来的页面进行刷新,我的问题就是,如何将修改后的数据设为选中行,并将其显示在dataGridView的第一行。那位高手会的... 查看详情

有没有一种简单的方法可以在 WinForms 中实现 Checked Combobox [重复]

】有没有一种简单的方法可以在WinForms中实现CheckedCombobox[重复]【英文标题】:IsthereasimplewaytoimplementaCheckedComboboxinWinForms[duplicate]【发布时间】:2012-02-0800:14:26【问题描述】:有谁知道WinForms中选中的组合框的简单实现?谷歌搜索... 查看详情

使用Entity Framework时如何在Winform场景下实现DataGridView的分页?

】使用EntityFramework时如何在Winform场景下实现DataGridView的分页?【英文标题】:HowcanIimplementpagingforDataGridViewinWinformscenariowhenusingEntityFramework?【发布时间】:2013-08-2008:36:18【问题描述】:我可以在网上找到的所有内容都是为asp.net使... 查看详情

winform窗体内函数调用

...数:privatevoidresult()for(inti=0;i<SearchResult.uiProbeID.Length;i++)dataGridView1.Rows.Add(SearchResult.uiProbeID[i],SearchResult.uiFileID[i],SearchResult.sFileName[i],SearchResult.sLastUpdataTime[i]);全局函数不能调用这个,错误是“非静态的字段、方法或属性"resul... 查看详情

关于在javaweb中实现图片显示

(4,12)其实对这个问题我在很早之前就有过资料的查询以及初步的尝试,不过因为一些原因一直没有成功 在Javaweb中实现图片显示需要首先将图片导入(粘贴)到web文件中理论上是在webapp文件夹下新建一个文件夹image,然后... 查看详情

怎么在c#中实现精确timer

...3.定义在System.Timers.Timer类里◆System.Windows.Forms.Timer应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用APISetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,ConsoleApplication(控... 查看详情

winform中(当数据库的数据有变化时)datagridview刷新的问题

B用户查询datagridview中显示人员信息,当A用户在同时登录这个程序而更改了某人员的信息时,B用户怎样也能在他当前查询界面不关闭的情况下看到更改的信息?如果用timer控件,怎么判断数据变化了再刷新,而不是隔几秒窗体就... 查看详情

在c#,winform下怎样实现使用打印控件printdocument来打印datagridview里的内容?

...,还有,我用的三层架构的模式,把数据查询出来显示在datagridview中,要打印的话,你的代码我需要怎么修改呢?偶是小白,求教。。。本回答被提问者采纳 参考技术B建议用这种方式:DataGridView中的数据导出Excel,可以选择是... 查看详情

我们如何在winform的datagridview中进行分页

】我们如何在winform的datagridview中进行分页【英文标题】:Howcanwedopaginationindatagridviewinwinform【发布时间】:2011-02-1900:37:20【问题描述】:我想在窗口窗体的datagridview中每页显示10条记录,用户必须单击下一步按钮才能显示接下来... 查看详情