0 votes

Annulation des événements Windows Forms

J'ai un formulaire Windows. Il comporte une ComboBox et une DataGrid.

J'ai un événement Leave sur ma combobox et j'ai un événement double-clic sur la ligne de ma grille de données.

L'idée est qu'en quittant la combobox, si la valeur de la combobox a changé plus de utiliser la nouvelle valeur pour recharger la grille de données.

Supposons que la liste déroulante affiche la valeur 1 et qu'il existe 5 enregistrements pour cette valeur. affichés dans la grille de données. Maintenant, l'utilisateur saisit 2 dans la liste déroulante et s'éloigne. la valeur a changé et je recharge la grille de données avec tous les enregistrements de cette valeur.

Mais si l'utilisateur saisit 2 et double-clique sur les enregistrements existants pour la valeur 1, alors la fonction l'événement de sortie recharge la grille de données et l'événement de double-clic se déclenche.

Comment puis-je trouver une liste d'événements en attente et annuler chacun d'entre eux, si l'événement est en cours d'exécution ? grille de données a été rechargée. merci pour toute aide

1voto

Stefan Points 7940

Au lieu d'utiliser l'événement de congé, essayez Événement SelectedIndexChanged qui serait déclenché avant l'événement double-clic de la grille de données. L'inconvénient est que si l'utilisateur fait défiler la liste déroulante avec le clavier, l'événement sera déclenché 5 fois si l'utilisateur fait défiler la liste déroulante 5 fois vers le bas.

Une autre solution serait de stocker une variable locale lComboEntered=true lors de l'entrée dans la combo et de mettre la valeur à false lorsque l'événement de sortie se déclenche. Et dans l'événement double-clic de la grille de données, vérifier si la variable lComboEntered=false avant de faire quoi que ce soit.

1voto

Hans Passant Points 475940

Vous avez un problème d'ordre des événements, l'événement DataGridView.Enter se déclenche trop tôt. Ce problème peut être résolu proprement en retardant les actions des événements avec la méthode Control.BeginInvoke(). Sa cible déléguée se déclenche dès que votre programme réintègre la boucle de messages. En d'autres termes, après que tous les événements en attente aient été déclenchés. Faites en sorte que cela ressemble à ceci :

private bool selectionDirty;

private void comboBox1_TextChanged(object sender, EventArgs e) {
  selectionDirty = true;
}

private void dataGridView1_Enter(object sender, EventArgs e) {
  this.BeginInvoke(new Action(() => selectionDirty = false));
}

private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) {
  if (selectionDirty) return;
  // etc...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X