VB.NET如何取消DataGridView复选框列的单元格选中状态
VB.NET DataGridView复选框列点击禁止单元格高亮实现
需求描述
- 交互要求:单击/双击复选框列单元格时,仅切换复选框勾选状态,不触发单元格选中高亮
- 当前效果:

- 目标效果:

现有业务代码
列显隐控制逻辑
If BtnVistaPorFacturar.Checked Then For i As Integer = 0 To DgvNeumaticos.Columns.Count - 1 DgvNeumaticos.Columns(i).Visible = False Next DgvNeumaticos.Columns("ColChk").Visible = True DgvNeumaticos.Columns("CodOS").Visible = True DgvNeumaticos.Columns("Tipo").Visible = True DgvNeumaticos.Columns("NroOrden").Visible = True DgvNeumaticos.Columns("NroOrden").DisplayIndex = 0 DgvNeumaticos.Columns("FechaOS").Visible = True DgvNeumaticos.Columns("F.Cierre").Visible = True DgvNeumaticos.Columns("Observacion").Visible = True DgvNeumaticos.Columns("CodNeumatico").Visible = True DgvNeumaticos.Columns("Externo").Visible = True DgvNeumaticos.Columns("CodTercero").Visible = True DgvNeumaticos.Columns("CodProducto").Visible = True DgvNeumaticos.Columns("Producto").Visible = True DgvNeumaticos.Columns("Trabajo").Visible = True DgvNeumaticos.Columns("NroDocRecepcion").Visible = True DgvNeumaticos.Columns("FechaRecepcion").Visible = True
复选框列初始化逻辑
If BtnVistaPorFacturar.Checked Then Dim chkCol As New DataGridViewCheckBoxColumn chkCol.Name = "ColChk" chkCol.HeaderText = "Chk" DgvNeumaticos.Columns.Add(chkCol) dt = WFOrdServicioNeumaticos.Instancia.fdu_NEUM_ORDSERV_VerOrdenesPorFacturar(.Cells("IDAgente").Value) End If
实现代码
直接给DgvNeumaticos控件绑定两个事件即可,不需要修改原有列初始化、显隐逻辑:
' 初始化时绑定事件,可放在窗体构造函数、Load事件中执行 AddHandler DgvNeumaticos.CurrentCellDirtyStateChanged, AddressOf DgvNeumaticos_InstantCommitCheck AddHandler DgvNeumaticos.CellMouseUp, AddressOf DgvNeumaticos_ClearCellSelectionOnCheckClick ' 实现点击复选框即时提交编辑,无需失去焦点才切换勾选状态 Private Sub DgvNeumaticos_InstantCommitCheck(sender As Object, e As EventArgs) If DgvNeumaticos.IsCurrentCellDirty AndAlso DgvNeumaticos.CurrentCell.OwningColumn.Name = "ColChk" Then DgvNeumaticos.CommitEdit(DataGridViewDataErrorContexts.Commit) End If End Sub ' 点击复选框列后清除单元格选中,避免出现高亮效果 Private Sub DgvNeumaticos_ClearCellSelectionOnCheckClick(sender As Object, e As DataGridViewCellMouseEventArgs) ' 排除表头行、无效行,仅处理复选框列的单元格点击 If e.ColumnIndex = DgvNeumaticos.Columns("ColChk").Index AndAlso e.RowIndex >= 0 Then DgvNeumaticos.ClearSelection() ' 如果需要保留整行选中效果(而非单个单元格高亮),取消注释下一行即可 ' DgvNeumaticos.Rows(e.RowIndex).Selected = True End If End Sub
可选优化:将
DgvNeumaticos.SelectionMode属性设置为FullRowSelect,配合上述代码可以完全避免单个单元格高亮,和目标演示效果完全匹配。
内容的提问来源于stack exchange,提问作者lsanchezo
相关产品推荐
相关产品推荐

