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.
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