DataGridViewCheckBoxColumn: intercettare il CheckState

     Riprendendo il progetto utilizzato per scrivere il post riferito alla corretta visualizzazione dei valori Null nelle colonne DataGridViewImageColumns, affrontiamo il problema di come aggiornare i dati presenti in una DataGridView modificando lo stato delle celle di una DataGridViewCheckBoxColumn.

     In questo esempio vogliamo che quando viene modificato lo stato di una DataGridViewCheckBoxCell, la DataGridViewImage reagisca istantaneamente mostrando o meno un’icona all’interno della cella corrispondente.

4


     Di default, la DataGridViewCheckBoxCell non esegue il commit dei dati nel momento in cui viene modificato lo stato della DataGridViewCheckBoxCell, ossia quando si fa click col mouse, ma lo effettua nel momento in cui perde il focus. Questo comportamento ci impedisce di aggiornare gli altri dati presenti all’interno della stessa DataGridView quando lo stato della DataGridViewCheckBoxCell cambia.

     Analizzando quindi la DataGridViewCheckBoxCell noteremo che non è predisposta a scatenare eventi tipo CheckStateChanged come una comune CheckBox.

     Questo perché la DataGridViewCheckBoxCell non utilizza un EditingControl predefinito di tipo CheckBox, a differenza, ad esempio, di quello utilizzato dalla DataGridViewComboBoxColumn che ne utilizza uno di tipo ComboBox.

     Dobbiamo quindi seguire un’altra strada per soddisfare questa necessità.

     Considerando che, come abbiamo già detto, la DataGridViewCheckBoxCell non scatena eventi fin quando non viene eseguito il commit dei dati, dovremmo essere noi, da codice, a forzare questo aggiornamento.

     Per farlo dobbiamo appoggiarci all’evento CurrentCellDirtyStateChanged che viene scatenato prima che le modifiche appena apportate alle celle vengano inviate alla cash dei dati.

    Per identificare le modifiche bisogna interrogare la proprietà IsBurrentCellDirty

 

Sub MyDGV1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles _
MyDGV1.CurrentCellDirtyStateChanged 
    If Me.MyDGV1.IsCurrentCellDirty Then 
        Me.MyDGV1.CommitEdit(DataGridViewDataErrorContexts.Commit) 
    End If
End Sub


      Il commit scatenerà a sua volta l’evento CellValueChanged che sfrutteremo per gestire od aggiornare i valori delle altre celle, colonne, campi o controlli...

' Gestisce la visualizzazione o meno dell'icona in funzione del valore della CheckBox. 
Public Sub MyDGV1_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
Handles MyDGV1.CellValueChanged
   If e.RowIndex > -1 AndAlso e.ColumnIndex = dgvColumn_IsPersonal.Index Then
      If CBool(MyDGV1.Rows(e.RowIndex).Cells(dgvColumn_IsPersonal.Index).Value) Then
         MyDGV1.Rows(e.RowIndex).Cells(dgvColumn_Icon.Index).Value = My.Resources.Caro_vecchio_floppy
      Else
         MyDGV1.Rows(e.RowIndex).Cells(dgvColumn_Icon.Index).Value = Nothing
      End If 
   End If
End Sub
 
Tag Cloud: ,

Print | posted on martedì 2 dicembre 2008 12.00

Feedback

# re: DataGridViewCheckBoxColumn: intercettare il CheckState

Left by Walimay at 03/12/2008 9.47
Gravatar Grande Andrea !

Max.

# re: DataGridViewCheckBoxColumn: intercettare il CheckState

Left by aurelio at 16/10/2010 19.32
Gravatar
che cosa sta ad indicare "dgvColumn_IsPersonal" ed "My.Resources.Caro_vecchio_floppy" ed "dgvColumn_Icon.Index"


grazie

# re: DataGridViewCheckBoxColumn: intercettare il CheckState

Left by Andrea at 18/10/2010 9.23
Gravatar Ciao Aurelio,
dgvColumn_IsPersonal e dgvColumn_Icon indicano il nome di due DataGridViewColumns, My.Resources.Caro_vecchio_floppy è invece il nome di una risorsa utilizzata (in questo caso l'immagine di un floppy).

Andrea

Your comment:





 
Please add 4 and 7 and type the answer here:

Copyright © Andrea Zingoni

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski