2010-07-28 3 views
7

Mon application C# a un comboBox avec un événement SelectedIndexChanged. Habituellement, je veux que cet événement se déclenche, mais parfois j'ai besoin de l'événement pour ne pas tirer. Mon comboBox est une liste de fichiers MRU. Si un fichier de la liste est introuvable, l'élément est supprimé du comboBox et le comboBoxSelectedIndex est défini sur zéro. Toutefois, la définition de comboBoxSelectedIndex à 0 entraîne l'exécution de l'événement SelectedIndexChanged, ce qui dans ce cas est problématique car il entraîne l'exécution d'un code UIF dans le gestionnaire d'événements. Existe-t-il un moyen gracieux de désactiver/activer les événements pour les contrôles de formulaire C#? Merci.Modification de ComboBox SelectedIndex sans déclencher d'événement en C#

Répondre

11

Démarrer la méthode eventhandler avec

ComboBox combo = sender as ComboBox; 
if (combo.SelectedIndex == 0) 
{ 
    return; 
} 

Si vous êtes problème est avec un autre eventhandler vous pouvez supprimer l'enregistrement des événements de la première eventhandler.

combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
combo.SelectedIndex = 0; 
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
1

un (assez laid) façon serait de mettre un drapeau dans le code qui supprime l'entrée, puis vérifiez que dans le gestionnaire SelectedIndexChanged:

if (!deletedEntry) 
{ 
    // Do stuff 
} 
deletedEntry = false; 

Une meilleure façon peut-être de supprimer votre SelectedIndexChanged gestionnaire d'événements au début de la méthode de suppression et le rétablir à la fin. De cette façon, le code ne saura pas que l'index a changé.

8

J'ai rencontré cela plusieurs fois au cours des années. Ma solution est d'avoir une variable de niveau classe appelée _noise et si je sais que je suis sur le point de changer l'index de combo ou tout autre contrôle similaire qui se déclenche quand l'index sélectionné change, je fais ce qui suit dans le code.

private bool _noise; 

Voici le code pour le gestionnaire d'événements de contrôle

private void cbTest_SelectedIndexChange(object sender, EventArgs e) 
{ 
    if (_noise) return; 

    // process the events code 

    ... 

} 


Puis, quand je sais que je vais changer l'index, je fais ce qui suit:

_noise = true; // cause the handler to ignore the noise... 


cbTest.Index = value; 


_noise = false; // let the event process again 
3

Je suis surpris qu'il n'y ait pas de meilleure façon de faire ça, mais c'est comme ça que je le fais. J'utilise en fait le champ Tag de la plupart des contrôles, donc je n'ai pas besoin de sous-classer le contrôle. Et j'utilise true/null comme valeurs, puisque null est la valeur par défaut.

Bien sûr, si vous utilisez réellement Tag, vous aurez besoin de le faire différemment ...

dans le gestionnaire:

private void control_Event(object sender, EventArgs e) 
{ 
    if (control.Tag != null) return; 

    // process the events code 

    ... 

} 

Dans le code principal

try 
{ 
    control.Tag = true; 
    // set the control property 
    control.Value = xxx; 
or 
    control.Index = xxx; 
or 
    control.Checked = xxx; 
    ... 
} 
finally 
{ 
    control.Tag = null; 
} 
Questions connexes