Les cases à cocher dans DataGridView ne déclenchent pas l’événement CellValueChanged

J’utilise ce code:

// Cell value change event. private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if ((bool)dataGridView1.CurrentCell.Value == true) MessageBox.Show("true"); if ((bool)dataGridView1.CurrentCell.Value == false) MessageBox.Show("false"); MessageBox.Show(dataGridView1.CurrentCell.Value.ToSsortingng()); } 

Cela fonctionne correctement pour toutes les colonnes, à l’exception d’une colonne avec une case à cocher ( DataGridViewCheckBoxColumn )

J’ai besoin de connaître la valeur dans la colonne de la case à cocher (true ou false).

Que dois-je faire pour cela?

Travailler avec DataGridViewCheckBoxColumn peut parfois être un peu délicat, car certaines règles s’appliquent spécifiquement aux Cells de ce type de colonne. Ce code doit gérer le problème que vous rencontrez.

L’événement CurrentCellDirtyStateChanged valide les modifications immédiatement lorsque l’utilisateur clique sur la cellule. Vous CellValueChanged manuellement l’événement CellValueChanged lorsque vous appelez la méthode CommitEdit .

 private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (dataGridView1.CurrentCell == null) return; if ((bool)dataGridView1.CurrentCell.Value == true) MessageBox.Show("true"); if ((bool)dataGridView1.CurrentCell.Value == false) MessageBox.Show("false"); MessageBox.Show(dataGridView1.CurrentCell.Value.ToSsortingng()); } private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (dataGridView1.IsCurrentCellDirty) { dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); } } 

Visitez ici pour plus d’informations sur l’utilisation de DataGridViewCheckBoxCell .

MSDN indique ici que CellValueChanged ne se déclenchera pas tant que la cellule n’aura pas perdu le focus.

Quelques solutions:

DataGridView.CellContentClick

http://codingeverything.blogspot.com/2013/01/firing-datagridview-cellvaluechanged.html

Je suis venu avec une solution légèrement différente.

J’utilise l’événement CurrentCellDirtyStateChanged pour vérifier si la colonne est la colonne de case à cocher et si c’est le cas, je déclenche manuellement l’événement CellValueChanged de la manière suivante:

 if (DGV_Charge.CurrentCell.ColumnIndex == 0) DGV_Charge_CellValueChanged(null, new DataGridViewCellEventArgs(DGV_Charge.CurrentCell.ColumnIndex, DGV_Charge.CurrentCell.RowIndex)); 

Le mieux est d’étendre la grid en créant votre propre grid, prête à utiliser ces différentes “astuces”. Croyez-moi, il y a beaucoup de choses qui nécessitent des ajustements dans cette grid.

Code suggéré en utilisant

 Public Class MyGrid Inherits Windows.Forms.DataGridView Private Sub MyGrid_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.CurrentCellDirtyStateChanged If Me.IsCurrentCellDirty AndAlso Not Me.CurrentCell Is Nothing Then If TypeOf Me.Columns(Me.CurrentCell.ColumnIndex) Is DataGridViewCheckBoxColumn Then Me.CommitEdit(DataGridViewDataErrorContexts.Commit) 'imediate commit, not only on focus changed End If End If End Sub Private Sub MyGrid_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles Me.CellValueChanged If e.RowIndex >= 0 AndAlso e.ColumnIndex >= 0 Then Dim Checked As Boolean = False If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewCheckBoxColumn Then 'avoid erros Checked = Me.CellChecked(e.RowIndex, e.ColumnIndex) End If RaiseEvent Change(e.RowIndex, e.ColumnIndex, Checked) End If End Sub End Class