Puis-je faire en sorte que DataGridView.EndEdit déclenche l’événement CellValidating?

J’utilise un DataGridView dans mon application WinForms. Mon objective principal est de faire en sorte que la touche Entrée ne passe pas à la ligne suivante de la grid. Je veux toujours que la touche Entrée valide et mette fin au mode édition.

J’ai trouvé cette entrée de FAQ et DataGridView sous-classé pour remplacer ProcessDialogKey (). Si la touche appuyée est Entrée, j’appelle EndEdit (), sinon j’appelle base.ProcessDialogKey ().

Cela fonctionne très bien, sauf que l’événement CellValidating n’est pas déclenché.

Actuellement, j’appelle simplement ma logique de validation avant d’appeler EndEdit, mais il me semble que quelque chose me manque.

Je suppose que je pourrais appeler OnCellValidating, mais je craindrais alors de rater un autre événement. Ce que je veux vraiment, c’est une sorte de EndEdit () qui se comporte comme si vous appuyiez sur la dernière ligne d’une grid avec l’ajout désactivé.

CellValidating n’est pas appelé jusqu’à ce que vous changiez le CurrentCell. Donc, la façon dont j’ai hésité autour de ça était de changer le CurrentCell, puis de revenir au courant.

protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Enter) { DataGridViewCell currentCell = CurrentCell; EndEdit(); CurrentCell = null; CurrentCell = currentCell; return true; } return base.ProcessDialogKey(keyData); } 

Le code de JJO va planter si la cellule est en mode édition. Ci-dessous évite l’exception de validation:

 DataGridViewCell currentCell = AttachedGrid.CurrentCell; try { AttachedGrid.EndEdit(); AttachedGrid.CurrentCell = null; AttachedGrid.CurrentCell = currentCell; } catch { AttachedGrid.CurrentCell = currentCell; AttachedGrid.CurrentCell.Selected = true; } 

Source: la réponse de Kennet Harris ici

Si la source de données de votre DataGridView est BindingSouce, procédez comme suit (mettez ceci dans vos événements de traitement de clé ):

 bds.EndEdit(); 

si la source de données de votre DataGridView est DataTable:

 this.BindingContext[dgv.DataSource].EndCurrentEdit(); 

merci pour la solution. ma version est légèrement différente de la vôtre, car lorsque je passe dans une autre cellule et que mon code renvoie e.cancel = false dans l’événement de validation de cellule, une erreur est générée. Cette opération indique que “l’opération n’a pas abouti, programme ne peut pas valider ou quitter un changement de valeur de cellule “. donc je mets try catch pour surmonter ce problème.

c’est mon code:

 Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean Dim key As Keys = (keyData And Keys.KeyCode) If key = Keys.Enter Then If MyBase.CurrentCell.ColumnIndex = 1 Then Dim iRow As Integer = MyBase.CurrentCell.RowIndex MyBase.EndEdit() Try MyBase.CurrentCell = Nothing MyBase.CurrentCell = MyBase.Rows(iRow).Cells(1) frmFilter.cmdOk_Click(Me, New EventArgs) Catch ex As Exception End Try Return True End If End If Return MyBase.ProcessDialogKey(keyData) End Function 

Non, mais vous pouvez déclencher manuellement l’événement CellValidating. Il suffit de créer les parameters appropriés. Tous les événements sont une classe utilisant le modèle Observer, ils ne sont pas différents des autres méthodes. Si cela ne fonctionne pas, vous pouvez créer un événement KeyPress sur la cellule et émuler en appuyant sur la touche Entrée de la cellule, mais cela risque de déranger l’interface utilisateur de l’utilisateur. Il suffit de remettre le carat là où il se trouvait.