如何使DataGridView单元格BackColor设置在CellValidating事件生效
问题根源
红色背景设置不生效是事件执行顺序和样式逻辑冲突导致的:
- 你之前实现的「进入单元格绘绿色、结束编辑恢复白色」逻辑,通常绑定在
CellEnter、CellEndEdit事件中,会在单元格焦点变化时主动修改单元格背景 CellValidating事件触发时单元格仍处于编辑状态,你设置完红色背景后又写了e.Cancel = True,会强制焦点留在当前单元格,立刻触发CellEnter事件的绿色背景逻辑,直接覆盖你刚设置的红色- 你调用的
InvalidateCell触发重绘时,同样会执行进入单元格的绿色样式逻辑,红色配置根本不会保留
修复步骤
不要在多个事件里零散修改单元格背景色,把所有背景样式逻辑统一收敛到CellPainting事件中处理,用全局变量标记校验错误状态,从根源避免样式覆盖。
- 首先在窗体类层级定义变量,存储校验失败的单元格引用
' 标记校验不通过的单元格,无错误时值为Nothing Private invalidCell As DataGridViewCell = Nothing - 修改原
CellValidating事件代码,只做校验和错误标记,不要直接修改样式Private Sub DataGridView4_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DataGridView4.CellValidating ' 每次校验先清空旧错误标记 invalidCell = Nothing Dim inputVal As String = CStr(e.FormattedValue) Dim colName As String = DataGridView4.Item(e.ColumnIndex, e.RowIndex).OwningColumn.Name If colName = "quantity" AndAlso Not IsNumeric(inputVal) Then ' 标记当前单元格为错误状态 invalidCell = DataGridView4.Rows(e.RowIndex).Cells(e.ColumnIndex) e.Cancel = True End If End Sub - 新增
CellPainting事件处理,统一管理所有单元格背景规则,优先级为:错误红 > 编辑状态绿 > 正常白Private Sub DataGridView4_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView4.CellPainting ' 跳过列头、行头区域 If e.RowIndex < 0 Or e.ColumnIndex < 0 Then Exit Sub Dim targetCell = DataGridView4(e.ColumnIndex, e.RowIndex) If invalidCell IsNot Nothing AndAlso targetCell Is invalidCell Then e.CellStyle.BackColor = Color.Red ElseIf DataGridView4.IsCurrentCellInEditMode AndAlso targetCell Is DataGridView4.CurrentCell Then e.CellStyle.BackColor = Color.Green Else e.CellStyle.BackColor = Color.White End If End Sub - 把你之前写在
CellEnter、CellEndEdit事件里所有修改单元格BackColor的代码全部删掉,避免冲突。后续单元格状态变化时CellPainting会自动触发重绘,不需要手动调用Invalidate方法。
内容的提问来源于stack exchange,提问作者Vblover
相关产品推荐
相关产品推荐

