繁体   English   中英

在ColumnHeaderMouseClick上切换DataGridView复选框列

[英]Toggle DataGridView checkbox column on ColumnHeaderMouseClick

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

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

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

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

如果不详细介绍checkCountrowsCount变量在做什么,我觉得两者对于目标都是不必要的。 另外,正如我之前所说,当单击“任意”列时,当前的OP代码正在“切换”值。 我只能假设这不是想要的。

一种可能的解决方案在下面发布。 首先,进行检查以确保单击了正确的“列”(chkColumn)。 如果单击“ chkColumn”, dgv暂时禁用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM