Ereignisse (Visual Basic)Events (Visual Basic)
Obwohl Sie ein Visual Studio-Projekt als eine Reihe von Prozeduren visualisieren können, die in einer Sequenz ausgeführt werden, sind die meisten Programme in der Praxis ereignisgesteuert – das bedeutet, dass der Ausführungs Fluss von externen vorkommen, die als Ereignisse bezeichnet werden, bestimmt wird.While you might visualize a Visual Studio project as a series of procedures that execute in a sequence, in reality, most programs are event driven—meaning the flow of execution is determined by external occurrences called events.
Ein Ereignis ist ein Signal, das eine Anwendung darüber informiert, dass etwas Wichtiges geschehen ist.An event is a signal that informs an application that something important has occurred. Wenn ein Benutzer beispielsweise auf ein Steuerelement in einem Formular klickt, löst das Formular ein Click
-Ereignis aus und ruft eine Prozedur auf, die das Ereignis behandelt.For example, when a user clicks a control on a form, the form can raise a Click
event and call a procedure that handles the event. Ereignisse ermöglichen zudem die Kommunikation zwischen separaten Tasks.Events also allow separate tasks to communicate. Beispiel: Die Anwendung führt separat von der Hauptanwendung einen Sortiertask aus.Say, for example, that your application performs a sort task separately from the main application. Wenn ein Benutzer den Sortiervorgang abbricht, kann die Anwendung ein Cancel-Ereignis senden, das den Abbruch des Sortiervorgangs veranlasst.If a user cancels the sort, your application can send a cancel event instructing the sort process to stop.
Ereignisse – Begriffe und KonzepteEvent Terms and Concepts
In diesem Abschnitt werden die Begriffe und Konzepte beschrieben, die mit Ereignissen in Visual Basic verwendet werden.This section describes the terms and concepts used with events in Visual Basic.
Deklarieren von EreignissenDeclaring Events
Ereignisse werden innerhalb von Klassen, Strukturen, Modulen und Schnittstellen mithilfe des Event
-Schlüsselworts deklariert, wie im folgenden Beispiel dargestellt:You declare events within classes, structures, modules, and interfaces using the Event
keyword, as in the following example:
Event AnEvent(ByVal EventNumber As Integer)
Auslösen von EreignissenRaising Events
Ein Ereignis ist mit einer Nachricht vergleichbar, die bekannt gibt, dass etwas Wichtiges geschehen ist.An event is like a message announcing that something important has occurred. Das Senden der Nachricht wird als Auslösen des Ereignisses bezeichnet.The act of broadcasting the message is called raising the event. In Visual Basic rufen Sie Ereignisse mit der- RaiseEvent
Anweisung auf, wie im folgenden Beispiel gezeigt:In Visual Basic, you raise events with the RaiseEvent
statement, as in the following example:
RaiseEvent AnEvent(EventNumber)
Ereignisse müssen im Geltungsbereich der Klasse, des Moduls oder der Struktur ausgelöst werden, in der bzw. dem sie deklariert wurden.Events must be raised within the scope of the class, module, or structure where they are declared. So kann beispielsweise eine abgeleitete Klasse keine Ereignisse auslösen, die von einer Basisklasse geerbt wurden.For example, a derived class cannot raise events inherited from a base class.
EreignissenderEvent Senders
Jedes Objekt, das in der Lage ist, ein Ereignis auszulösen, ist ein Ereignissender (auch Ereignisquelle genannt).Any object capable of raising an event is an event sender, also known as an event source. Formulare, Steuerelemente und benutzerdefinierte Objekte sind Beispiele für Ereignissender.Forms, controls, and user-defined objects are examples of event senders.
EreignishandlerEvent Handlers
Ereignishandler sind Prozeduren, die aufgerufen werden, wenn ein entsprechendes Ereignis eintritt.Event handlers are procedures that are called when a corresponding event occurs. Jede gültige Unterroutine mit einer übereinstimmenden Signatur kann als Ereignishandler verwendet werden.You can use any valid subroutine with a matching signature as an event handler. Funktionen können jedoch nicht als Ereignishandler verwendet werden, da sie keinen Wert an die Ereignisquelle zurückgeben können.You cannot use a function as an event handler, however, because it cannot return a value to the event source.
Visual Basic verwendet eine Standard Benennungs Konvention für Ereignishandler, die den Namen des Ereignis Absenders, einen Unterstrich und den Namen des Ereignisses kombiniert.Visual Basic uses a standard naming convention for event handlers that combines the name of the event sender, an underscore, and the name of the event. Das Click
-Ereignis einer Schaltfläche mit dem Namen button1
heißt beispielsweise Sub button1_Click
.For example, the Click
event of a button named button1
would be named Sub button1_Click
.
Hinweis
Beim Definieren von Ereignishandlern für Ihre Ereignisse empfiehlt sich die Verwendung dieser Benennungskonvention, sie ist jedoch nicht erforderlich. Sie können stattdessen auch jeden gültigen Unterroutinennamen verwenden.We recommend that you use this naming convention when defining event handlers for your own events, but it is not required; you can use any valid subroutine name.
Verknüpfen von Ereignissen mit EreignishandlernAssociating Events with Event Handlers
Bevor ein Ereignishandler verwendet werden kann, müssen Sie ihn über die Handles
- oder die AddHandler
-Anweisung mit einem Ereignis verknüpfen.Before an event handler becomes usable, you must first associate it with an event by using either the Handles
or AddHandler
statement.
WithEvents und die Handles-KlauselWithEvents and the Handles Clause
Die WithEvents
-Anweisung und die Handles
-Klausel bieten die Möglichkeit, Ereignishandler per Deklaration festzulegen.The WithEvents
statement and Handles
clause provide a declarative way of specifying event handlers. Ein Ereignis, das durch ein mit dem WithEvents
-Schlüsselwort deklariertes Objekt ausgelöst wird, kann von einer beliebigen Prozedur mit einer Handles
-Anweisung für dieses Ereignis behandelt werden (siehe folgendes Beispiel):An event raised by an object declared with the WithEvents
keyword can be handled by any procedure with a Handles
statement for that event, as shown in the following example:
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
Die WithEvents
-Anweisung und die Handles
-Klausel sind häufig die beste Wahl für Ereignishandler, da die hier verwendete Deklarationssyntax das Programmieren, Lesen und Debuggen der Ereignisbehandlung vereinfacht.The WithEvents
statement and the Handles
clause are often the best choice for event handlers because the declarative syntax they use makes event handling easier to code, read and debug. Beachten Sie jedoch die folgenden Einschränkungen bei der Verwendung von WithEvents
-Variablen:However, be aware of the following limitations on the use of WithEvents
variables:
Sie können eine
WithEvents
-Variable nicht als Objektvariable verwenden.You cannot use aWithEvents
variable as an object variable. Dies bedeutet, dass Sie die Variable nicht alsObject
deklarieren können, sondern den Klassennamen angeben müssen, wenn Sie die Variable deklarieren.That is, you cannot declare it asObject
—you must specify the class name when you declare the variable.Da freigegebene Ereignisse nicht an Klassen Instanzen gebunden sind, können Sie nicht verwenden,
WithEvents
um freigegebene Ereignisse deklarativ zu verarbeiten.Because shared events are not tied to class instances, you cannot useWithEvents
to declaratively handle shared events. Ebenso können SieWithEvents
oderHandles
nicht zum Behandeln von Ereignissen aus einerStructure
verwenden.Similarly, you cannot useWithEvents
orHandles
to handle events from aStructure
. In beiden Fällen können Sie diese Ereignisse mit derAddHandler
-Anweisung behandeln.In both cases, you can use theAddHandler
statement to handle those events.Sie können keine Arrays aus
WithEvents
-Variablen erstellen.You cannot create arrays ofWithEvents
variables.
Mit WithEvents
-Variablen kann ein einziger Ereignishandler eine oder mehrere Ereignisarten bzw. einen oder mehrere Ereignishandler zur Behandlung derselben Art von Ereignissen verarbeiten.WithEvents
variables allow a single event handler to handle one or more kind of event, or one or more event handlers to handle the same kind of event.
Die Handles
-Klausel ist zwar das Standardverfahren zum Verknüpfen eines Ereignisses mit einem Ereignishandler, ist aber auf das Verknüpfen von Ereignissen mit Ereignishandlern zur Kompilierzeit beschränkt.Although the Handles
clause is the standard way of associating an event with an event handler, it is limited to associating events with event handlers at compile time.
In einigen Fällen, wie z. b. bei Ereignissen, die Formularen oder Steuerelementen zugeordnet sind, Visual Basic automatisch einen leeren Ereignishandler aus und ordnet ihn einem Ereignis zu.In some cases, such as with events associated with forms or controls, Visual Basic automatically stubs out an empty event handler and associates it with an event. Wenn Sie z. b. auf eine Befehls Schaltfläche in einem Formular im Entwurfs Modus doppelklicken, erstellt Visual Basic einen leeren Ereignishandler und eine WithEvents
Variable für die Befehls Schaltfläche, wie im folgenden Code gezeigt:For example, when you double-click a command button on a form in design mode, Visual Basic creates an empty event handler and a WithEvents
variable for the command button, as in the following code:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler und RemoveHandlerAddHandler and RemoveHandler
Die AddHandler
-Anweisung ähnelt der Handles
-Klausel insofern, als Sie mit beiden einen Ereignishandler angeben können.The AddHandler
statement is similar to the Handles
clause in that both allow you to specify an event handler. AddHandler
bietet Ihnen jedoch zusammen mit RemoveHandler
mehr Flexibilität als die Handles
-Klausel, da es ein dynamisches Hinzufügen, Entfernen und Ändern des einem Ereignis zugeordneten Ereignishandlers ermöglicht.However, AddHandler
, used with RemoveHandler
, provides greater flexibility than the Handles
clause, allowing you to dynamically add, remove, and change the event handler associated with an event. Wenn Sie freigegebene Ereignisse oder Ereignisse aus einer Struktur behandeln möchten, müssen Sie AddHandler
verwenden.If you want to handle shared events or events from a structure, you must use AddHandler
.
AddHandler
benötigt zwei Argumente: den Namen eines Ereignisses von einem Ereignissender (z.B. einem Steuerelement) und einen Ausdruck, der einen Delegaten ergibt.AddHandler
takes two arguments: the name of an event from an event sender such as a control, and an expression that evaluates to a delegate. Wenn Sie AddHandler
verwenden, müssen Sie die Delegatklasse nicht explizit angeben, da die AddressOf
-Anweisung stets einen Verweis auf den Delegaten zurückgibt.You do not need to explicitly specify the delegate class when using AddHandler
, since the AddressOf
statement always returns a reference to the delegate. Im folgenden Beispiel wird ein Ereignishandler mit einem Ereignis verknüpft, das durch ein Objekt ausgelöst wird:The following example associates an event handler with an event raised by an object:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
Für RemoveHandler
, wodurch ein Ereignis von einem Ereignishandler getrennt wird, wird die gleiche Syntax verwendet wie für AddHandler
.RemoveHandler
, which disconnects an event from an event handler, uses the same syntax as AddHandler
. Beispiel:For example:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
Im folgenden Beispiel ist einem Ereignis ein Ereignishandler zugeordnet, und das Ereignis wird ausgelöst.In the following example, an event handler is associated with an event, and the event is raised. Der Ereignishandler fängt das Ereignis ab und zeigt eine Meldung an.The event handler catches the event and displays a message.
Anschließend wird der erste Ereignishandler entfernt, und dem Ereignis wird ein anderer Ereignishandler zugeordnet.Then the first event handler is removed and a different event handler is associated with the event. Beim erneuten Auslösen des Ereignisses wird eine andere Meldung angezeigt.When the event is raised again, a different message is displayed.
Schließlich wird der zweite Ereignishandler entfernt, und das Ereignis wird zum dritten Mal ausgelöst.Finally, the second event handler is removed and the event is raised for a third time. Da dem Ereignis kein Ereignishandler mehr zugeordnet ist, wird keine Aktion ausgeführt.Because there is no longer an event handler associated with the event, no action is taken.
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
Behandeln von Ereignissen, die von einer Basisklasse geerbt wurdenHandling Events Inherited from a Base Class
Abgeleitete Klassen sind Klassen, die Merkmale von einer Basisklasse erben. Sie können mithilfe der Handles MyBase
-Anweisung Ereignisse behandeln, die von ihrer Basisklasse ausgelöst wurden.Derived classes—classes that inherit characteristics from a base class—can handle events raised by their base class using the Handles MyBase
statement.
So behandeln Sie Ereignisse aus einer BasisklasseTo handle events from a base class
Deklarieren Sie einen Ereignishandler in der abgeleiteten Klasse, indem Sie der Deklarationszeile der Prozedur für den Ereignishandler eine
Handles MyBase.
Ereignisname-Anweisung hinzufügen. Dabei ist Ereignisname der Name des zu behandelnden Ereignisses in der Basisklasse.Declare an event handler in the derived class by adding aHandles MyBase.
eventname statement to the declaration line of your event-handler procedure, where eventname is the name of the event in the base class you are handling. Beispiel:For example:Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
Verwandte AbschnitteRelated Sections
TitelTitle | BESCHREIBUNGDescription |
---|---|
Exemplarische Vorgehensweise: Deklarieren und Auslösen von EreignissenWalkthrough: Declaring and Raising Events | Stellt eine Schritt-für-Schritt-Beschreibung des Deklarierens und Auslösens von Ereignissen für eine Klasse bereit.Provides a step-by-step description of how to declare and raise events for a class. |
Exemplarische Vorgehensweise: Behandeln von EreignissenWalkthrough: Handling Events | Veranschaulicht das Schreiben einer Ereignishandlerprozedur.Demonstrates how to write an event-handler procedure. |
Vorgehensweise: Deklarieren von benutzerdefinierten Ereignissen, um eine Blockierung zu vermeidenHow to: Declare Custom Events To Avoid Blocking | Veranschaulicht die Definition eines benutzerdefinierten Ereignisses, das einen asynchronen Aufruf seiner Ereignishandler zulässt.Demonstrates how to define a custom event that allows its event handlers to be called asynchronously. |
How to: Deklarieren von benutzerdefinierten Ereignissen zum Einsparen von ArbeitsspeicherHow to: Declare Custom Events To Conserve Memory | Veranschaulicht die Definition eines benutzerdefinierten Ereignisses, das nur bei der Behandlung des Ereignisses Arbeitsspeicher nutzt.Demonstrates how to define a custom event that uses memory only when the event is handled. |
Problembehandlung für geerbte Ereignishandler in Visual BasicTroubleshooting Inherited Event Handlers in Visual Basic | Führt häufige Probleme auf, die bei Ereignishandlern in geerbten Komponenten auftreten können.Lists common issues that arise with event handlers in inherited components. |
EreignisseEvents | Bietet eine Übersicht über das Ereignismodell in .NET Framework.Provides an overview of the event model in the .NET Framework. |
Erstellen von Ereignishandlern in Windows FormsCreating Event Handlers in Windows Forms | Beschreibt die Verwendung von Ereignissen, die Windows Forms-Objekten zugeordnet sind.Describes how to work with events associated with Windows Forms objects. |
DelegatenDelegates | Stellt eine Übersicht über Delegaten in Visual Basic bereit.Provides an overview of delegates in Visual Basic. |