我有一个DataGridView dgv
,它的第一列为复选框列chkColumn
,然后通过SQL查询用其他列填充。
我希望能够单击chkColumn
标头并切换所有行的复选框。
我当前的代码是这个,但是单击标题可以正确完成操作,除了任何选定的单元格/行:
Private Sub chkColumn_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.ColumnHeaderMouseClick
Dim checkCount As Integer = 0
Dim rowsCount As Integer = 0
For Each row As DataGridViewRow In dgv.Rows
rowsCount = rowsCount + 1
If row.Cells("chkColumn").Value = 1 Then
checkCount = checkCount + 1
End If
Next
If checkCount < rowsCount Then
For Each row As DataGridViewRow In dgv.Rows
row.Cells("chkColumn").Value = 1
Next
Else
For Each row As DataGridViewRow In dgv.Rows
row.Cells("chkColumn").Value = 0
Next
End If
End Sub
答案 0 :(得分:1)
我质疑您的评论... “单击标题可以正确完成操作,除了任何选定的单元格/行:” …我同意“选择的”单元格不切换的部分。但是,我不同意“正确完成操作。”
运行发布代码的测试显示,第一次单击“任何”列标题时,所有复选框都将设置为选中状态。然后,对“ any”列的任何后续单击都将简单地将“所有”行切换为相同的值。这意味着第一次单击该列后,所有复选框将具有相同的值。看来您可能使它变得比必须的复杂。
与“选定”单元格未切换有关的问题是正确的。显然,如果选择了该单元格,则其值不会被切换。一个简单的解决方案可能是在此过程之前“禁用”网格,并在切换完成之后“启用”网格。这取决于是否还有其他可能的事件在“寻找”单元格值更改等。……
在没有详细介绍checkCount
和rowsCount
变量的作用的情况下,我认为两者对于目标而言都是不必要的。另外,如我之前所述,当前的OP代码在单击“任意”列时正在“切换”值。我只能假设这不是想要的。
以下是一种可能的解决方案。首先,进行检查以确保单击了正确的“列”(chkColumn)。如果单击“ chkColumn”,DataGridView
dgv
将被暂时禁用,并且循环将遍历网格中的所有行。一个“切换” Boolean
的简单解决方案是取反。这就是下面的代码的作用……每个复选框的值都设置为与当前值相反。
此方法可能存在的问题可能来自“如何”获取网格数据。对于某些数据源,您可能需要使用其他方法。希望能有所帮助。
Private Sub dgv_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.ColumnHeaderMouseClick
If (dgv.Columns(e.ColumnIndex).Name = "chkColumn") Then
dgv.Enabled = False
For Each row As DataGridViewRow In dgv.Rows
If (Not row.IsNewRow) Then
row.Cells("chkColumn").Value = Not (row.Cells("chkColumn").Value)
End If
Next
dgv.Enabled = True
End If
End Sub