Ereignisse (Visual Basic)

Sie können sich ein Visual Studio-Projekt als eine Reihe von Prozeduren vorstellen, die nacheinander ausgeführt werden, doch sind die meisten Programme tatsächlich ereignisgesteuert. Das bedeutet, dass der Ausführungsablauf von externen Vorkommnissen bestimmt wird, die als Ereignisse bezeichnet werden.

Ein Ereignis ist ein Signal, das eine Anwendung darüber informiert, dass etwas Wichtiges geschehen ist. Wenn der 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. Darüber hinaus ermöglichen Ereignisse die Kommunikation zwischen separaten Aufgaben. Beispiel: Die Anwendung führt separat von der Hauptanwendung eine Sortieraufgabe aus. Wenn ein Benutzer den Sortiervorgang abbricht, kann die Anwendung ein Cancel-Ereignis senden, das den Abbruch des Sortiervorgangs veranlasst.

Begriffe und Konzepte im Zusammenhang mit Ereignissen

In diesem Abschnitt werden die in Visual Basic im Zusammenhang mit Ereignissen verwendeten Begriffe und Konzepte erläutert.

Deklarieren von Ereignissen

Ereignisse werden innerhalb von Klassen, Strukturen, Modulen und Schnittstellen mithilfe des Event-Schlüsselworts deklariert, wie im folgenden Beispiel dargestellt:

Event AnEvent(ByVal EventNumber As Integer)

Auslösen von Ereignissen

Ein Ereignis ist mit einer Nachricht vergleichbar, die bekannt gibt, dass etwas Wichtiges geschehen ist. Das Senden der Nachricht wird als Auslösen des Ereignisses bezeichnet. In Visual Basic lösen Sie Ereignisse mit der RaiseEvent-Anweisung aus, wie im folgenden Beispiel veranschaulicht:

RaiseEvent AnEvent(EventNumber)

Ereignisse müssen im Gültigkeitsbereich der Klasse, des Moduls oder der Struktur ausgelöst werden, in der sie deklariert wurden. So kann beispielsweise eine abgeleitete Klasse keine Ereignisse auslösen, die von einer Basisklasse geerbt wurden.

Ereignissender

Jedes Objekt, das in der Lage ist, ein Ereignis auszulösen, ist ein Ereignissender (auch Ereignisquelle genannt). Formulare, Steuerelemente und benutzerdefinierte Objekte sind Beispiele für Ereignissender.

Ereignishandler

Ereignishandler sind Prozeduren, die aufgerufen werden, wenn ein entsprechendes Ereignis auftritt. Als Ereignishandler kann jede gültige Unterroutine mit einer übereinstimmenden Signatur verwendet werden. Funktionen können nicht als Ereignishandler verwendet werden, da sie keinen Wert an die Ereignisquelle zurückgeben können.

Visual Basic verwendet eine standardmäßige Benennungskonvention für Ereignishandler. Danach besteht der Name aus dem Namen des Ereignissenders, einem Unterstrich und dem Namen des Ereignisses. Das Click-Ereignis einer Schaltfläche mit dem Namen button1 heißt beispielsweise Sub button1_Click.

Tipp

Die Verwendung dieser Benennungskonvention wird für die Definition von Ereignishandlern für eigene Ereignisse empfohlen, ist jedoch nicht erforderlich. Sie können stattdessen auch einen gültigen Unterroutinennamen verwenden.

Verknüpfen von Ereignissen mit Ereignishandlern

Bevor ein Ereignishandler verwendet werden kann, müssen sie ihn über die Handles-Anweisung oder die AddHandler-Anweisung mit einem Ereignis verknüpfen.

WithEvents und die Handles-Klausel

Die WithEvents-Anweisung und die Handles-Klausel bieten die Möglichkeit, Ereignishandler per Deklaration festzulegen. Ein Ereignis, das durch ein Objekt ausgelöst wird, das mit dem WithEvents-Schlüsselwort deklariert wurde, kann von einer beliebigen Prozedur mit einer Handles-Anweisung für dieses Ereignis behandelt werden (siehe folgendes Beispiel):

' 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 Kombination für Ereignishandler, da die hier verwendete Deklarationssyntax das Kodieren, Lesen und Debuggen der Ereignisbehandlung vereinfacht. Beachten Sie jedoch die folgenden Beschränkungen bei der Verwendung von WithEvents-Variablen:

  • Sie können eine WithEvents-Variable nicht als Objektvariable verwenden. Dies bedeutet, Sie können die Variable nicht als Object deklarieren, sondern Sie müssen den Klassennamen angeben, wenn Sie die Variable deklarieren.

  • Da freigegebene Ereignisse nicht an Klasseninstanzen gebunden sind, können Sie WithEvents nicht für die deklarative Behandlung freigegebener Ereignisse verwenden. Ebenso können Sie WithEvents oder Handles nicht zum Behandeln von Ereignissen aus einer Structure verwenden. In beiden Fällen können Sie diese Ereignisse mit der AddHandler-Anweisung behandeln.

  • Sie können keine Arrays aus WithEvents-Variablen erstellen.

Mit WithEvents-Variablen kann ein einziger Ereignishandler eine oder mehrere Ereignisarten bzw. einen oder mehrere Ereignishandler zur Behandlung derselben Art von Ereignissen behandeln.

Die Handles-Klausel ist zwar das Standardverfahren zum Verknüpfen eines Ereignisses mit einem Ereignishandler, ist jedoch dennoch auf das Verknüpfen von Ereignissen mit Ereignishandlern während der Kompilierung beschränkt.

In einigen Fällen, z. B. bei Ereignissen, die Formularen oder Steuerelementen zugeordnet sind, erstellt Visual Basic automatisch einen Stub für einen leeren Ereignishandler und ordnet ihn einem Ereignis zu. Wenn Sie z. B. im Entwurfsmodus auf eine Befehlsschaltfläche doppelklicken, erstellt Visual Basic einen leeren Ereignishandler und eine WithEvents-Variable für die Befehlsschaltfläche (siehe folgenden Code):

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

"AddHandler" und "RemoveHandler"

Die AddHandler-Anweisung ähnelt der Handles-Klausel insofern, als Sie mit beiden einen Ereignishandler angeben können. 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. Wenn Sie freigegebene Ereignisse oder Ereignisse aus einer Struktur behandeln möchten, müssen Sie AddHandler verwenden.

AddHandler benötigt zwei Argumente: den Namen eines Ereignisses von einem Ereignissender (z. B. einem Steuerelement) und einen Ausdruck, der einen Delegaten ergibt. Wenn Sie AddHandler verwenden, müssen Sie die Delegatklasse nicht explizit angeben, da die AddressOf-Anweisung stets einen Verweis auf den Delegaten zurückgibt. Im folgenden Beispiel wird ein Ereignishandler mit einem Ereignis verknüpft, das durch ein Objekt ausgelöst wird:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

Für RemoveHandler, der ein Ereignis von einem Ereignishandler trennt, wird die gleiche Syntax verwendet wie für AddHandler. Beispiel:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Im folgenden Beispiel ist einem Ereignis ein Ereignishandler zugeordnet, und das Ereignis wird ausgelöst. Der Ereignishandler fängt das Ereignis ab und zeigt eine Meldung an.

Anschließend wird der erste Ereignishandler entfernt, und dem Ereignis wird ein anderer Ereignishandler zugeordnet. Beim erneuten Auslösen des Ereignisses wird eine andere Meldung angezeigt.

Schließlich wird der zweite Ereignishandler entfernt, und das Ereignis wird zum dritten Mal ausgelöst. Da dem Ereignis kein Ereignishandler mehr zugeordnet ist, wird keine Aktion ausgeführt.

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 aus einer Basisklasse geerbt wurden

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.

So behandeln Sie Ereignisse aus einer Basisklasse

  • 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. Beispiel:

    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 Abschnitte

Titel

Beschreibung

Exemplarische Vorgehensweise: Deklarieren und Auslösen von Ereignissen (Visual Basic)

Stellt eine schrittweise Beschreibung des Deklarierens und Auslösens von Ereignissen für eine Klasse bereit.

Exemplarische Vorgehensweise: Behandeln von Ereignissen (Visual Basic)

Veranschaulicht das Schreiben einer Ereignishandlerprozedur.

Gewusst wie: Deklarieren von benutzerdefinierten Ereignissen, um eine Blockierung zu vermeiden (Visual Basic)

Veranschaulicht, wie ein benutzerdefiniertes Ereignis definiert wird, das den asynchronen Aufruf seiner Ereignishandler zulässt.

Gewusst wie: Deklarieren von benutzerdefinierten Ereignissen, um Speicherplatz zu sparen (Visual Basic)

Veranschaulicht, wie ein benutzerdefiniertes Ereignis definiert wird, das nur bei der Behandlung des Ereignisses Speicher nutzt.

Problembehandlung für geerbte Ereignishandler in Visual Basic

Listet allgemeine Probleme auf, die bei Ereignishandlern in geerbten Komponenten auftreten können.

Behandeln und Auslösen von Ereignissen

Bietet eine Übersicht über das Ereignismodell in .NET Framework.

Erstellen von Ereignishandlern in Windows Forms

Beschreibt die Verwendung von Ereignissen, die Windows Forms-Objekten zugeordnet sind.

Delegaten (Visual Basic)

Stellt eine Übersicht über Delegaten in Visual Basic bereit.