模拟DataGridViewCheckBox的OnClick事件?

时间:2015-09-06 13:30:02

标签: c# .net vb.net winforms datagridviewcomboboxcell

VB或C#......第一眼看到的一项微不足道的任务。对于 DataGridViewCheckBox ,创建名为 OnClick()方法,当且仅当复选框的已更改时< strong> user (使用 Space 或鼠标左键单击)。

也许有这样的事件 - CellContentClick - 但它似乎遭受与事件顺序相关的错误和由空间改变的值因调用而无效到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

我们能够模拟无缝无效的事件吗?

一致性标准:

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

  • 点击里面复选框或按 Space 后,应触发更改事件。

  • 在chackbox单元格中单击

  • 时,会触发更改事件。

  • 只有当值更改时才会触发更改事件(true←→false)。

  • 测试复选框值应该给出与复选框状态相对应的结果。

帮助代码:

'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 - 无论你喜欢什么。)

1 个答案:

答案 0 :(得分:0)

致电EndEdit()需要balacing - 添加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

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