首页 > 解决方案 > 更新 CellClick 上的 DataGridViewCheckBoxColumn 复选框

问题描述

我有一个带有 DataGridViewCheckBoxColumn 列的 DataGridView。单元格大小大于复选框,因此为了使其用户友好,我希望 CellClick 事件的行为就像复选框本身被单击一样。

目前,我在 CellClick 事件中执行此操作:

If e.ColumnIndex = dgv.Columns("CONFIRM").Index Then
        If CBool(dgv.Item("CONFIRM", e.RowIndex).Value) = True Then
            dgv.Item("CONFIRM", e.RowIndex).Value = False
        Else
            dgv.Item("CONFIRM", e.RowIndex).Value = True
        End If
End If

但是,直到单元格失去焦点后,复选框才真正改变状态。我已经看到了许多关于处理不同事件(CellValueChanged、CurrentCellDirtyStateChanged)(例如http://www.codingeverything.com/2013/01/firing-datagridview-cellvaluechanged.html)和提交更改的建议:

If dgvDownloads.IsCurrentCellDirty Then
        dgvDownloads.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If

但是这不起作用,dgv 闪烁但复选框不会更改选中状态。

单击包含单元格时,如何强制 DataGridViewCheckBoxColumn 中的复选框更新其状态?

标签: vb.netdatagridview

解决方案


尝试更多这样:

Public Class FormDGV

    Private Sub FormDGV_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        With DataGridView1
            .Columns.Add(New DataGridViewCheckBoxColumn With {
                         .Name = "Confirm",
                         .HeaderText = "Confirm"})
        End With
    End Sub

    Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
        If DataGridView1.IsCurrentCellDirty Then
            DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
        End If
    End Sub

    Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
        If CType(DataGridView1.Rows(e.RowIndex).Cells("Confirm").Value, Boolean) Then
            DataGridView1.Rows(e.RowIndex).Cells("Confirm").Value = False
        Else
            DataGridView1.Rows(e.RowIndex).Cells("Confirm").Value = True
        End If
        Validate()
    End Sub
End Class

推荐阅读