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
相关产品推荐
相关产品推荐

