模拟 DataGridViewCheckBox 的 OnClick 事件?
Simulating OnClick event for DataGridViewCheckBox?
VB or C#... 乍一看是个微不足道的任务。对于 DataGridViewCheckBox,创建 OnClick() 方法,当且仅当 复选框的值为 由用户更改(使用Space或单击鼠标左键)。
也许已经有这样的事件 – CellContentClick – 但它似乎存在与事件顺序和更改值相关的错误 Space 由于调用 EndEdit()
.
而无法工作
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时,应触发更改事件。
更改事件应该不在复选框单元格内单击时触发,但在复选框外单击。
仅当值 更改(true ←→ false)时才应触发 Change 事件。
复选框值的测试应该给出对应于复选框状态的结果。
帮助代码:
'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
现在,检测复选框的变化和读取其即时状态似乎是可靠的。
VB or C#... 乍一看是个微不足道的任务。对于 DataGridViewCheckBox,创建 OnClick() 方法,当且仅当 复选框的值为 由用户更改(使用Space或单击鼠标左键)。
也许已经有这样的事件 – CellContentClick – 但它似乎存在与事件顺序和更改值相关的错误 Space 由于调用 EndEdit()
.
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时,应触发更改事件。
更改事件应该不在复选框单元格内单击时触发,但在复选框外单击。
仅当值 更改(true ←→ false)时才应触发 Change 事件。
复选框值的测试应该给出对应于复选框状态的结果。
帮助代码:
'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
现在,检测复选框的变化和读取其即时状态似乎是可靠的。