我有一个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
发布于 2018-12-12 19:42:30
我质疑你的评论,…单击标头可正确完成操作,但选定的单元格/行除外:“…我同意关于“选定的”单元格不切换的部分。但是,我不同意“正确地完成操作”。
运行已发布代码的测试表明,当单击“任何”列标题“第一次”时,所有复选框都将被设置为“选中”。然后,以后单击“任意”列时,只需将“所有”行切换到相同的值。这意味着在第一次单击列之后,所有复选框都将是相同的值。看起来你可能让这件事变得更复杂了。
有关“选定的”单元格没有被切换的问题是正确的。显然,如果选择了单元格,它的值就不会被切换。一个简单的解决方案可能是在此过程之前“禁用”网格,并在切换完成后“启用”网格。这取决于是否有其他可能的事件“寻找”单元格值更改等。…。
没有详细说明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
https://stackoverflow.com/questions/53744952
复制