DataGridView中处于编辑状态的CheckBox单元格选中状态无法被正确判定如何解决
问题原因
你遇到的问题是因为处于编辑模式的DataGridView单元格,用户的勾选操作还没有被提交到单元格的Value属性中。你调用的RefreshEdit作用是刷新编辑控件的显示,用于同步外部修改到编辑界面,完全不具备提交编辑结果的作用,所以不会生效。
解决方法
方法1:遍历前主动结束所有编辑操作(最简便)
只需要在你的遍历统计代码前,添加一行调用EndEdit的代码即可,该方法会主动将当前编辑中的修改提交到单元格的Value属性:
' 主动结束当前单元格的编辑,提交修改 dgv1.EndEdit() ' 原有的统计逻辑 Dim NumCBChecked As Integer = 0 For i = 0 To dgv1.Rows.Count - 1 If CBool(dgv1(0, i).Value) = True Then NumCBChecked += 1 End If Next
方法2:勾选后自动提交编辑(全局生效,无需每次统计前处理)
你可以为dgv1的CellContentClick事件添加处理逻辑,用户点击复选框后立刻提交编辑,从根源避免这个问题:
Private Sub dgv1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv1.CellContentClick ' 只处理第0列的复选框点击 If e.ColumnIndex = 0 AndAlso e.RowIndex >= 0 Then ' 提交当前单元格的编辑 dgv1.EndEdit() End If End Sub
方法3:遍历过程中兼容处理编辑状态的单元格
如果不希望修改编辑状态,也可以在统计时主动判断单元格是否处于编辑状态,直接取编辑控件的选中值:
Dim NumCBChecked As Integer = 0 For i = 0 To dgv1.Rows.Count - 1 Dim cell = dgv1(0, i) Dim isChecked As Boolean ' 判断当前单元格是否正处于编辑状态 If dgv1.CurrentCell Is cell AndAlso dgv1.IsCurrentCellInEditMode Then ' 直接取编辑控件的选中状态 Dim editCtrl As DataGridViewCheckBoxEditingControl = DirectCast(dgv1.EditingControl, DataGridViewCheckBoxEditingControl) isChecked = editCtrl.Checked Else isChecked = CBool(cell.Value) End If If isChecked Then NumCBChecked += 1 End If Next
内容的提问来源于stack exchange,提问作者user16594857
相关产品推荐
相关产品推荐

