在ColumnHeaderMouseClick上切换DataGridView复选框列

时间:2018-12-12 14:13:36

标签: vb.net datagridview

我有一个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

1 个答案:

答案 0 :(得分:1)

我质疑您的评论... “单击标题可以正确完成操作,除了任何选定的单元格/行:” …我同意“选择的”单元格不切换的部分。但是,我不同意“正确完成操作。”

运行发布代码的测试显示,第一次单击“任何”列标题时,所有复选框都将设置为选中状态。然后,对“ any”列的任何后续单击都将简单地将“所有”行切换为相同的值。这意味着第一次单击该列后,所有复选框将具有相同的值。看来您可能使它变得比必须的复杂。

与“选定”单元格未切换有关的问题是正确的。显然,如果选择了该单元格,则其值不会被切换。一个简单的解决方案可能是在此过程之前“禁用”网格,并在切换完成之后“启用”网格。这取决于是否还有其他可能的事件在“寻找”单元格值更改等。……

在没有详细介绍checkCountrowsCount变量的作用的情况下,我认为两者对于目标而言都是不必要的。另外,如我之前所述,当前的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