模拟 DataGridViewCheckBox 的 OnClick 事件?

Simulating OnClick event for DataGridViewCheckBox?

VB or C#... 乍一看是个微不足道的任务。对于 DataGridViewCheckBox,创建 OnClick() 方法,当且仅当 复选框的值为 用户更改(使用Space或单击鼠标左键)。

也许已经有这样的事件 – CellContentClick – 但它似乎存在与事件顺序和更改值相关的错误 Space 由于调用 EndEdit().

而无法工作

→ view C# equivalents

Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellContentClick
    If IsCurrentCellCheckBoxCell(sender) Then
        DirectCast(sender, DataGridView).EndEdit()
        PrintValueOfCurrentCheckBox()
    End If
End Sub

我们是否能够模拟无缝运行、没有错误的事件?

一致性标准:

(只是一个标准的用户体验——它们应该是显而易见的)

帮助代码:

'result validation
Sub PrintValueOfCurrentCheckBox()
    If DataGridView1.CurrentCell Is Nothing Then Return
    Console.WriteLine(DataGridView1.CurrentRow.Cells(DataGridView1.CurrentCell.ColumnIndex).Value.ToString())
End Sub

'universal helper
Shared Function IsCurrentCellCheckBoxCell(dataGridViewSender As Object) As Boolean
    If TypeOf dataGridViewSender Is DataGridView Then
        With DirectCast(dataGridViewSender, DataGridView)
            If .CurrentCell IsNot Nothing Then
                Dim currentColumn As DataGridViewColumn = .Columns(.CurrentCell.ColumnIndex)
                Return TypeOf currentColumn Is DataGridViewCheckBoxColumn
            End If
        End With
    End If
    Return False
End Function

(C# 或 VB – 任何你喜欢的。)

呼叫 EndEdit() 需要平衡 – 添加 BeginEdit().

我找到了罪魁祸首。使用 Space 键切换复选框不起作用,因为 EndEdit() 不够。它需要通过 BeginEdit().

来平衡
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellContentClick
    If IsCurrentCellCheckBoxCell(sender) Then
        DirectCast(sender, DataGridView).EndEdit()
        PrintValueOfCurrentCheckBox()
        DirectCast(sender, DataGridView).BeginEdit(false) ' added method call
    End If
End Sub

现在,检测复选框的变化和读取其即时状态似乎是可靠的。