Comment désinscrire tous les gestionnaires pour un événement de formulaire?

StackOverflow https://stackoverflow.com/questions/287663

  •  08-07-2019
  •  | 
  •  

Question

J'ai deux gestionnaires qui utilisent le même formulaire. Comment puis-je supprimer les gestionnaires avant d'ajouter le nouveau (C #)?

Était-ce utile?

La solution

Si vous travaillez dans le formulaire lui-même, vous devriez pouvoir faire quelque chose comme:

PseudoCode:

Delegate[] events = Form1.SomeEvent.GetInvokationList();

foreach (Delegate d in events)
{
     Form1.SomeEvent -= d;
}

De l'extérieur du formulaire, votre SOL.

Autres conseils

Si vous savez ce que sont ces gestionnaires, supprimez-les simplement de la même manière que vous y êtes abonné, sauf avec - = au lieu de + =.

Si vous ne savez pas ce que sont les gestionnaires, vous ne pouvez pas les supprimer. L'idée étant que l'encapsulation d'événement empêche une partie intéressée d'empiéter sur les intérêts d'une autre classe en observant un événement.

EDIT: Je suppose que vous parlez d’un événement mis en œuvre par une classe différente, par exemple. un contrôle. Si votre classe " possède " l'événement, puis définissez simplement la variable pertinente sur null.

Je réalise que cette question est assez ancienne, mais j'espère que cela aidera quelqu'un. Vous pouvez annuler l’enregistrement de tous les gestionnaires d’événements de toute classe avec un peu de réflexion.

public static void UnregisterAllEvents(object objectWithEvents)
{
    Type theType = objectWithEvents.GetType();

    //Even though the events are public, the FieldInfo associated with them is private
    foreach (System.Reflection.FieldInfo field in theType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance))
    {
        //eventInfo will be null if this is a normal field and not an event.
        System.Reflection.EventInfo eventInfo = theType.GetEvent(field.Name);
        if (eventInfo != null)
        {
            MulticastDelegate multicastDelegate = field.GetValue(objectWithEvents) as MulticastDelegate;
            if (multicastDelegate != null)
            {
                foreach (Delegate _delegate in multicastDelegate.GetInvocationList())
                {
                    eventInfo.RemoveEventHandler(objectWithEvents, _delegate);
                }
            }
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top