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

VB.NET 2015中DataGridView复选框勾选前验证及取消勾选问题

解决DataGridView复选框勾选前验证的问题

问题根源

你使用的CellContentClick事件是在复选框状态已经切换后才触发的,所以此时无法取消勾选操作。需要改用**CellValueChanging事件**——它会在单元格值即将改变时触发,能直接阻止不合法的状态切换。

解决方案代码

1. 验证并阻止不合法勾选(CellValueChanging事件)

Private Sub dgvDetalle_CellValueChanging(sender As Object, e As DataGridViewCellValueChangingEventArgs) Handles dgvDetalle.CellValueChanging
    ' 替换为你的复选框列索引或列名判断
    Dim checkBoxColIndex As Integer = dgvDetalle.Columns("你的复选框列名").Index
    If e.ColumnIndex = checkBoxColIndex AndAlso e.RowIndex >= 0 Then
        ' 计算时间差(修正原代码的拼写错误:dgvDetal → dgvDetalle)
        Dim DifMinutes As Double = DateDiff(DateInterval.Minute, CDate(dgvDetalle(20, e.RowIndex).Value), Date.Now)
        ' 时间差未超过60分钟时,取消复选框状态更改
        If DifMinutes <= 60 Then
            e.Cancel = True
            MessageBox.Show("该记录无法勾选,时间差未超过60分钟")
        End If
    End If
End Sub

2. 更新TotalSP统计(CellValueChanged事件)

只有当复选框状态成功改变时,才更新统计值:

Private Sub dgvDetalle_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvDetalle.CellValueChanged
    Dim checkBoxColIndex As Integer = dgvDetalle.Columns("你的复选框列名").Index
    If e.ColumnIndex = checkBoxColIndex AndAlso e.RowIndex >= 0 Then
        Dim isChecked As Boolean = CBool(dgvDetalle.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)
        TotalSP = If(isChecked, TotalSP + 1, TotalSP - 1)
    End If
End Sub

注意事项

  • 替换代码中的你的复选框列名为实际的列名称,或直接使用列索引(推荐用列名,避免列顺序变动导致错误)。
  • 原代码中dgvDetal是拼写错误,需修正为dgvDetalle。

内容的提问来源于stack exchange,提问作者Fernando Diaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:16:57