Sie können dies tun, um einen neuen Ereignishandler für ein Steuerelement zu erstellen
c.Click += new EventHandler(mainFormButton_Click);
oder dieses
c.Click += mainFormButton_Click;
und um einen Ereignishandler zu entfernen, können Sie dies tun
c.Click -= mainFormButton_Click;
Aber wie entfernen Sie alle Ereignishandler aus einem Ereignis?
c.Click = null
?Clear
Methode war anscheinend zu viel AufwandAntworten:
Ich habe in den MSDN-Foren eine Lösung gefunden . Der folgende Beispielcode entfernt alle
Click
Ereignisse ausbutton1
.quelle
RemoveClickEvent
beginnen :FieldInfo f1 = typeof(Button)
? Ich bekomme null von,GetField
wenn ich benutzeControl
.ObservableCollection.CollectionChanged += null;
Ihr macht euch diesen Weg zu schwer. So einfach ist das:
quelle
FindClicked = null;
was eher einfacher ist.kinect.ColorFrameReady -= MyEventHander
funktioniert jedoch, aber es gibt keineGetInvocationList()
Methode für Kinect-Instanzen, um über ihre Delegaten zu iterieren.GetInvocationList
nicht gefunden.Vom Entfernen aller Ereignishandler :
quelle
Akzeptierte Antwort ist nicht voll. Es funktioniert nicht für Ereignisse, die als {add; entfernen;}
Hier ist Arbeitscode:
quelle
BindingFlags.Public
beim erstenGetField
Aufruf verwendete.Das Löschen eines nicht vorhandenen Ereignishandlers schadet nicht. Wenn Sie also wissen, welche Handler es möglicherweise gibt, können Sie einfach alle löschen. Ich hatte gerade einen ähnlichen Fall. Dies kann in einigen Fällen hilfreich sein.
Mögen:
quelle
Ich benutze diese Methode tatsächlich und sie funktioniert perfekt. Der Code, den Aeonhack hier geschrieben hat, hat mich "inspiriert" .
Das Feld MyEventEvent ist ausgeblendet, aber vorhanden.
Beim Debuggen können Sie sehen, wie
d.target
das Objekt das Ereignis tatsächlich behandelt, undd.method
Methode es verwendet. Sie müssen es nur entfernen.Es funktioniert großartig. Keine Objekte mehr, die aufgrund der Ereignishandler nicht gced wurden.
quelle
Ich hasste alle hier gezeigten Komplettlösungen, machte einen Mix und testete jetzt, arbeitete für jeden Event-Handler:
Einfach! Danke für Stephen Punak.
Ich habe es verwendet, weil ich eine generische lokale Methode zum Entfernen der Delegaten verwende und die lokale Methode nach verschiedenen Fällen aufgerufen wurde, wenn verschiedene Delegaten festgelegt wurden.
quelle
Wenn Sie dies wirklich tun müssen ... wird es einige Zeit dauern , bis Sie darüber nachdenken . Ereignishandler werden in einer Ereignis-zu-Delegat-Zuordnung innerhalb eines Steuerelements verwaltet. Sie müssten
Kurz gesagt, viel Arbeit. Theoretisch ist das möglich ... Ich habe so etwas noch nie versucht.
Überprüfen Sie, ob Sie eine bessere Kontrolle / Disziplin über die Abonnement-Abbestellungsphase für die Kontrolle haben können.
quelle
Stephen hat recht. Es ist sehr leicht:
quelle
foreach (EventHandler<MyCompletedArgs> handler in CompletionCompleted.GetInvocationList())
{
CompletionCompleted -= handler;
}
Ich habe gerade festgestellt, wie Ereignisse beim Festlegen einer Eigenschaft eines WinForms-Steuerelements angehalten werden . Es werden alle Ereignisse aus einem Steuerelement entfernt:
quelle
Beeindruckend. Ich habe diese Lösung gefunden, aber nichts hat so funktioniert, wie ich es wollte. Aber das ist so gut:
quelle
Diese Seite hat mir sehr geholfen. Der Code, den ich von hier erhalten habe, sollte ein Klickereignis von einer Schaltfläche entfernen. Ich muss Doppelklickereignisse aus einigen Bedienfeldern entfernen und Ereignisse aus einigen Schaltflächen anklicken. Also habe ich eine Steuerungserweiterung erstellt, die alle Ereignishandler für ein bestimmtes Ereignis entfernt.
Nun die Verwendung dieser Erweiterung. Wenn Sie Klickereignisse von einer Schaltfläche entfernen müssen,
Wenn Sie Doppelklickereignisse aus einem Bereich entfernen müssen,
Ich bin kein Experte für C #. Wenn es also Fehler gibt, verzeihen Sie mir bitte und lassen Sie es mich wissen.
quelle
Manchmal müssen wir mit ThirdParty-Steuerelementen arbeiten und diese umständlichen Lösungen erstellen. Basierend auf der Antwort von @Anoop Muraleedharan habe ich diese Lösung mit Inferenztyp und ToolStripItem-Unterstützung erstellt
Und Sie können es so verwenden
quelle
Ich habe eine andere funktionierende Lösung von Douglas gefunden .
Diese Methode entfernt alle Ereignishandler, die für ein bestimmtes Routet-Ereignis in einem Element festgelegt wurden.
Verwenden Sie es wie
Vollständiger Code:
quelle
Entfernt alle Handler für die Schaltfläche: save.RemoveEvents ();
quelle
Nun, hier gibt es eine andere Lösung zum Entfernen eines zugeordneten Ereignisses (wenn Sie bereits eine Methode zum Behandeln der Ereignisse für das Steuerelement haben):
quelle
Dies ist keine Antwort auf das OP, aber ich dachte, ich würde dies hier posten, falls es anderen helfen kann.
quelle
Ich habe diese Antwort gefunden und sie passte fast zu meinen Bedürfnissen. Vielen Dank an SwDevMan81 für die Klasse. Ich habe es geändert, um die Unterdrückung und Wiederaufnahme einzelner Methoden zu ermöglichen, und ich dachte, ich würde es hier veröffentlichen.
quelle