Frage

Ich habe 2-Handler das gleiche Formular. Wie kann ich die Handler entfernen, bevor die neuen (C #) hinzufügen?

War es hilfreich?

Lösung

Wenn Sie im Formular selbst arbeiten, sollten Sie in der Lage sein, etwas zu tun:

Pseudo-Code:

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

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

Von außerhalb des Formulars Ihre SOL.

Andere Tipps

Wenn Sie wissen, was diese Handler sind, nur entfernen Sie sie auf die gleiche Art und Weise, die Sie sie abonniert haben, es sei denn, -. = Statt + =

Wenn Sie nicht wissen, was die Handler sind, können Sie sie nicht entfernen. - Die Idee ist, dass das Ereignis Verkapselung von clobbering die Interessen einer anderen Klasse ein Interessent verhindert, dass ein Ereignis bei der Beobachtung

EDIT: Ich habe davon aus, dass Sie über ein Ereignis von einer anderen Klasse implementiert sprechen, z.B. Eine Kontrolle. Wenn Ihre Klasse „besitzt“ das Ereignis, dann setzen Sie einfach die entsprechende Variable auf null.

Ich weiß, diese Frage ist ziemlich alt, aber hoffentlich wird es helfen, jemand aus. Sie können mit einer wenig Reflexion für jede Klasse all Event-Handler deregistrieren.

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);
                }
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top