Hinzufügen von event-handler, die vor anderen event-Handler
Wenn ich nutzen AddHandler in VB-eigene Methode zum Click-Ereignis :
AddHandler Button.Click, AddressOf myButton_Click
Ich sehen, dass mein code ausgeführt wird letzter nach der anderen event-Handler für das Button_Click-Ereignis.
Gibt es eine Möglichkeit zum einfügen von meinem event-handler vor von anderen Veranstaltungen, so dass es wird zuerst ausgeführt?
Ich tagged diese Frage als C# sowie VB, bitte fühlen Sie sich frei zu verwenden eitherlanguage wenn Sie irgendwelche Vorschläge haben.
Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Reihenfolge der Ausführung der Handler für ein einzelnes event nicht kontrolliert werden kann, durch die grundlegende Verhalten einer integrierten Veranstaltung. MulticastDelegates sind die "Taschen" der Handler, und Sie nur packen Sie Sie ein zu einer Zeit. Beachten Sie, dass dies ist, wie die meisten Entwickler, dass das funktionieren wird, und es kann gefährlich sein, zu ermöglichen, um-abhängige event-Handler. Event-Handler soll in der Regel nicht voneinander wissen, denn wenn Sie abhängig sind, ausgeführt wird, bevor oder nachdem Sie einen anderen handler, müssen Sie zunächst wissen von der Existenz der anderen handler (Verletzung verbergen der Daten und mehrere andere design-Prinzipien), und die zweite, wenn, die Bestellung ändert, wird das Verhalten gebrochen werden.
Wenn Sie verstehen, all dies, und immer noch wollen, um die Reihenfolge der Ausführung der Handler ein Ereignis, das folgenden erhalten Sie schließen.
Könnte der code wie folgt Aussehen:
Merken, dass Sie sich nicht mehr anbringen-Handler andere als MasterClickHandler der Veranstaltung; Sie können nicht Ihren Kuchen haben und ihn auch Essen, beide überschreiben und halten die basic-Veranstaltung Verhalten. Es ist auch nicht ein "insert" - Verhalten eingebaut, das Ereignis "Eigenschaft"; Sie haben zu definieren, eine Methode, die dies ermöglicht. Zu guter Letzt sollten Sie nie das Ereignis auslösen, MyControlButtonClick direkt (obwohl, wie zu Steuern, ist der einzige, der dies durchgesetzt werden kann, durch code-Inspektion).
Nun, wenn Sie auf die Schaltfläche klicken, wird der button integrierten Click-Ereignis feuert MasterEventHandler, der ausgeführt wird, die Delegierten in MyHandlers in der gleichen Reihenfolge, wie Sie befestigt wurden MyControlButtonClick (mit allen, die eingefügt wurden zuerst ausgeführt, und zwar in umgekehrter Reihenfolge, wie Sie eingefügt wurden). Wenn Sie dieser code in einem custom user control mit der Taste, konnte man sogar den Namen des benutzerdefinierten Ereignisses an Ihrer Fernbedienung Auf, und die Steuerung würde das Aussehen und funktionieren ähnlich wie die Schaltfläche enthält, mit der Ausnahme, dass die zusätzliche Kontrolle über einfügen-Handler. Die Schönheit der ganzen Sache ist, dass nichts über diesen code zwingt die Konsumenten, mit ihm zu arbeiten, als etwas anderes als ein plain ol' vanilla-event.
Nicht leicht.
Dass gesagt wird, tun Sie es nicht. Ihr code sollte sich keine Gedanken über das, was um es genannt - es sollte einfach nur darauf, dass die Schaltfläche in Frage, auf die geklickt wurde. Alle Handler, einschließlich Ihrer eigenen, die ausgeführt wird. Wenn die Reihenfolge wichtig ist, sollten Sie überdenken Ihr design, und verwenden einen anderen Mechanismus zu kontrollieren.
Ist es eher ein Implementierungsdetail der VB.NET es hat eine Alternative Art des Umgangs mit Ereignissen mit WithEvents und die Handles keywords. Ein event-handler verwendet, Verarbeitet wird abonniert, indem Sie automatisch generierten code in der Formular-Konstruktor. Dieser code wird ausgeführt, bevor Sie Ihren code, einschließlich InitializeComponent oder Ihre benutzerdefinierte AddHandler-Anweisung. Und wird also immer zuerst ausgeführt werden.
Ihren code zu erhalten, um zu garantieren, führen erste ist möglich. Leiten Sie Ihre eigene Klasse aus-Taste und überschreiben Sie die OnClick-Methode:
Ich hatte ein ähnliches problem.
Hatte ich ein Ereignis: Geschlossen, dass zwei verschiedene Objekte hören. Und ich hatte, um sicher zu sein, dass die 1. Objekt das Ereignis wird aufgerufen, bevor der 2.
Hier seine meine Lösung (in C#):
Diese Weise für alle Veranstaltungen möchte ich zuerst aufgerufen werden:
Und für alle die Ereignisse, die ich wollen als zuletzt:
*beide Weg hinzufügen eines Ereignisses sind die gleichen, mit und ohne "new EventHandler()"
Hoffe, ich war hilfreich.