You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:18:04