【问题标题】:Toggle DataGridView checkbox column on ColumnHeaderMouseClick在 ColumnHeaderMouseClick 上切换 DataGridView 复选框列
【发布时间】:2018-12-13 11:50:01
【问题描述】:

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

【问题讨论】:

    标签: vb.net datagridview


    【解决方案1】:

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

    我运行发布的代码的测试表明,当“第一次”单击“任何”列标题时,所有复选框都将设置为选中。然后,任何后续单击“任何”列将简单地将“所有”行切换为相同的值。这意味着在第一次单击该列后,所有复选框将具有相同的值。看来你可能让这变得比它必须的更复杂。

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

    没有详细说明 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
    

    【讨论】:

    • 谢谢。非常有帮助。我知道我把它复杂化了,但我不知道如何简化。唯一的问题,我在我的问题中没有正确解释的一个问题是,我想将所有行切换为 True 或 False,独立于当前值。目前,如果我勾选一行,然后单击标题,它永远不会“全选”。但是,这可能足以让我解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多