Обновить флажок DataGridViewCheckBoxColumn на CellClick - PullRequest
1 голос
/ 18 апреля 2019

У меня есть DataGridView со столбцом DataGridViewCheckBoxColumn. Размер ячейки больше, чем у флажка, поэтому, чтобы сделать его удобным для пользователя, я хочу, чтобы событие 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 обновлять его состояние при щелчке по содержащейся ячейке?

1 Ответ

2 голосов
/ 18 апреля 2019

Попробуй больше так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...