我自己也有这个问题。我正在使用以下代码,但我无法弄清楚为什么它一直无法正常工作。
(请注意,我的代码是用 VB 编写的,但我认为同样的概念也适用于其他 .NET 语言)
Dim check As DataGridViewCheckBoxCell = DataGridView1.Rows(i).Cells("columnNameHere")
If check.Value = check.TrueValue Then
'do stuff
End If
然后我意识到这是因为单元格的基础值在失去焦点之前没有改变。我认为 DGV 的行为总是这样,但很容易忘记。
我的解决方案是简单地在点击事件处理程序的数据网格视图中添加一点代码。当用户点击复选框时,它所做的只是将焦点转移到别处。我将焦点转移到一个标签上,这样它就不会产生任何意想不到的后果。(例如:如果您将其切换到一个按钮,用户可能会在按下 Enter 并激活一个随机按钮时感到惊讶。)根据您的 DGV 中的其他内容,您可能需要检查事件的列索引,以便您仅对复选框列执行此操作。无论如何,我的 DGV 中的所有其他列都是只读的,所以对我来说没关系。
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Label1.Focus()
End Sub
如果有问题的代码包含在按钮中,焦点就会从 DGV 转移到按钮上,所以这不是问题。在我的例子中,代码是由定时器激活的——这意味着有问题的 DGV 单元在定时器触发之前不会失去焦点。