VB或C#......第一眼看到的一项微不足道的任务。对于 DataGridViewCheckBox ,创建名为的 OnClick()方法,当且仅当复选框的值已更改时< strong> user (使用 Space 或鼠标左键单击)。
也许有这样的事件 - CellContentClick - 但它似乎遭受与事件顺序相关的错误和由空间改变的值因调用而无效到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 后,应触发更改事件。
在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 - 无论你喜欢什么。)
答案 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
现在,检测复选框的变化并读取其即时状态似乎是可靠的。