Como atualizar um DataGridView vinculado ao clicar na caixa de seleção
-
21-12-2019 - |
Pergunta
Meta
Eu preciso de uma maneira de definir itens como Concluído clicando em um CheckBox
no meu limite DataGridView
.Feito isso, o item não será mais visto do DataGridView
devido a um DataView
filtro de linha.
Explicação
eu tenho um DataGridView
que está vinculado a um DataView
.
Private Sub LoadLispImprovements()
Private ViewLispImprovements As New DataView
ViewLispImprovements.Table = Programs.Tables("dtLispImprovements")
ViewLispImprovements.RowFilter = "Completed=0"
Lisp_dgvImprovements.DataSource = ViewLispImprovements
End Sub
Esse DataView
a tabela de foi definida para o seguinte DataTable
:
Esse DataTable
tem sua chave primária definida no campo correto.O Completed
field tem um quadrado vermelho só para mostrar a vocês que eu o defini como um valor booleano.
Dê uma olhada no meu DataGridView
:
Aqui é onde eu clicaria na caixa de seleção e o item deveria ser filtrado (porque a caixa de seleção Mostre tudo não está verificado)
Problema
Quando clico no CheckBox
, o item permanece no DataGridView
.Para que seja filtrado, devo selecionar outra linha.Dê uma olhada:
E quando mudo de linha, finalmente desaparece:
Como faço para que ele seja removido imediatamente depois de marcar a caixa de seleção preenchida?
P.S:Sim, tenho o manipulador de eventos CurrentCellDirtyStateChanged.
Private Sub Lisp_dgvImprovements_CurrentCellDirtyStateChanged(sender As Object, e As System.EventArgs) Handles Lisp_dgvImprovements.CurrentCellDirtyStateChanged
If Lisp_dgvImprovements.IsCurrentCellDirty Then
Lisp_dgvImprovements.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Solução
Você pode conseguir isso encerrando a edição do DataRow
quando o valor da célula é alterado.
Private Sub Lisp_dgvImprovements_CurrentCellDirtyStateChanged(sender As Object, e As System.EventArgs) Handles Lisp_dgvImprovements.CurrentCellDirtyStateChanged
If (Me.Lisp_dgvImprovements.IsCurrentCellDirty) Then
Me.Lisp_dgvImprovements.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Private Sub Lisp_dgvImprovements_CellValueChanged(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Lisp_dgvImprovements.CellValueChanged
' |-- The index of boolean DataGridViewColumn
If ((e.ColumnIndex = 0) AndAlso (e.RowIndex > -1)) Then
With Me.Lisp_dgvImprovements.Rows(e.RowIndex)
If (Not .IsNewRow) Then
With DirectCast(.DataBoundItem, DataRowView).Row
' |-- The index of boolean DataColumn
.Item(0) = True
.EndEdit()
End With
End If
End With
End If
End Sub