Question

Cela semble être un problème très simple et très courant. L’exemple le plus simple auquel je puisse penser est le suivant:

Le formulaire comporte cinq cases à cocher avec un "cocher tout / rien cocher". case à cocher au-dessus d'eux. Lorsqu'un utilisateur sélectionne toutes les cases à cocher, je bascule les états des "enfants". - Évidemment, je ne veux pas déclencher les chèques de tous les enfants avant d’avoir fini de cocher toutes les cases.

Je ne trouve pas d'événement de contrôle de suspension au niveau du formulaire. Si je manque simplement cela, c'est une excellente réponse simple. Sauf solution simple qui me manque, quel est le meilleur moyen (suspension? Solution acceptée?) De suspendre des événements de contrôle de formulaire?

Était-ce utile?

La solution

Je suis déjà tombé dessus et j'ai souvent vu des gens faire ça:

/*SNIP*/

private bool isMassUpdate;

public void Check1_Check(object sender, EventArgs e)
{
   if(!isMassUpdate)
   {
       do some stuff
   }
}

/*SNIP*/

Vous pouvez également détacher et rattacher les gestionnaires d'événements, mais on me dit que cela peut être une source de fuites de mémoire.

Informations sur les fuites de mémoire et les gestionnaires d'événements: ils ne sont pas directement liés à l'attachement et au détachement, mais nous avons constaté dans l'une de nos applications qu'un mauvais référencement des gestionnaires d'événements dans les arborescences d'héritage pouvait en être la cause.

Autres conseils

Ce que je fais dans ces cas-là, au lieu d’avoir une valeur booléenne qui suspend les événements, j’utilise un compteur. Lorsque le compte est > 0, puis suspendre les événements, lorsque le nombre = 0, puis reprendre les événements. Cela aide à résoudre le problème si plusieurs éléments peuvent demander une suspension d'événements.

L'autre chose utile est que si je dois suspendre des événements dans un bloc, je crée une petite classe d'assistance IDisposable que je peux utiliser dans un script "using". bloquer (en C #) donc je n'oublie pas de décrémenter le compteur une fois que je suis hors de portée.

De votre autre question, je suppose que vous utilisez VB .NET. Alors, RemoveHandler est votre meilleur pari. Normalement, dans VB, les gens configurent des gestionnaires d'événements à l'aide de la clause Handles. Mais vous pouvez aussi le faire de cette façon:

AddHandler chk1.CheckedChanged, AddressOf DoSomething

où DoSomething pourrait-il ressembler à ceci:

Private Sub DoSomething(ByVal sender As Object, ByVal e As EventArgs)
    ' whatever
End Sub

AddHandler connecte l'événement pour qu'il se déclenche. Pour qu’il ne se déclenche pas, utilisez RemoveHandler:

RemoveHandler chk1.CheckedChanged, AddressOf DoSomething

Avant de mettre à jour les cases à cocher de la propriété Checked de votre enfant, appelez RemoveHandler sur chacune d’elles; puis, lorsque vous avez terminé, appelez AddHandler pour rétablir les gestionnaires d’événements. Si toutes vos cases à cocher utilisent le même gestionnaire, vous pouvez les placer dans une collection et les parcourir en boucle pour ajouter ou supprimer les gestionnaires.

Vous pouvez également envisager de gérer les événements de type "clic" pour les boutons, plutôt que les modifications cochées. Cela pourrait être plus proche de votre intention.

Dans mon application Visual Basic 6.0 , je devais gérer les utilisateurs en double-cliquant sur < em> tout , donc sur tous mes gestionnaires d'événements, j'ai une ligne qui vérifie une variable globale

Private bSuspendEvents as Boolean

Private Sub Button1_Click()

    On Error Goto ErrorHandler

    If bSuspendEvents then Exit Sub

    bSuspendEvents = True

    'Do stuff

    NormalExit:
        bSuspendEvents = False
        Exit Sub

    ErrorHandler:
        'Handle Error
        Resume NormalExit

End Sub

Voir la question relative au dépassement de capacité Comment ignorer les événements simples qui se déclenchent lors de la modification des états de contrôle dans les Windows Forms C #?

  

Pour le cas plus général, si vous avez des relations complexes entre les contrôles, vous pouvez vérifier quel contrôle a déclenché l'événement en vérifiant sa propre propriété Focused ... chaque objet ne dépend que de lui-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top