Freigeben über


Ereignisse (Visual Basic)

Sie können zwar ein Visual Studio-Projekt als eine Reihe von Prozeduren visualisieren, die in einer Sequenz ausgeführt werden, in Wirklichkeit sind die meisten Programme ereignisgesteuert , d. h. der Ausführungsfluss wird durch externe Vorkommen bestimmt, die als Ereignisse bezeichnet werden.

Ein Ereignis ist ein Signal, das eine Anwendung darüber informiert, dass etwas Wichtiges aufgetreten ist. Wenn ein Benutzer beispielsweise auf ein Steuerelement in einem Formular klickt, kann das Formular ein Click Ereignis auslösen und eine Prozedur aufrufen, die das Ereignis behandelt. Ereignisse ermöglichen auch die Kommunikation separater Aufgaben. Angenommen, Ihre Anwendung führt eine Sortieraufgabe getrennt von der Hauptanwendung aus. Wenn ein Benutzer die Sortierung abbricht, kann ihre Anwendung ein Cancel-Ereignis senden, das den Sortiervorgang anweist, den Vorgang zu beenden.

Ereignisbegriffe und -konzepte

In diesem Abschnitt werden die Begriffe und Konzepte beschrieben, die mit Ereignissen in Visual Basic verwendet werden.

Deklarieren von Ereignissen

Sie deklarieren Ereignisse innerhalb von Klassen, Strukturen, Modulen und Schnittstellen mithilfe des Event Schlüsselworts, wie im folgenden Beispiel gezeigt:

Event AnEvent(ByVal EventNumber As Integer)

Auslösen von Ereignissen

Ein Ereignis ist wie eine Meldung, die angibt, dass etwas Wichtiges aufgetreten 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 gezeigt:

RaiseEvent AnEvent(EventNumber)

Ereignisse müssen innerhalb des Bereichs der Klasse, des Moduls oder der Struktur ausgelöst werden, in der sie deklariert werden. Eine abgeleitete Klasse kann z. B. keine ereignisse auslösen, die von einer Basisklasse geerbt wurden.

Ereignis-Absender

Jedes Objekt, das ein Ereignis auslösen kann, ist ein Ereignissender, auch bekannt als Ereignisquelle. Formulare, Steuerelemente und benutzerdefinierte Objekte sind Beispiele für Ereignis-Absender.

Ereignishandler

Ereignishandler sind Prozeduren , die aufgerufen werden, wenn ein entsprechendes Ereignis auftritt. Sie können eine beliebige gültige Unterroutine mit einer übereinstimmenden Signatur als Ereignishandler verwenden. Sie können eine Funktion jedoch nicht als Ereignishandler verwenden, da sie keinen Wert an die Ereignisquelle zurückgeben kann.

Visual Basic verwendet eine Standardbenennungskonvention für Ereignishandler, die den Namen des Ereignissenders, einen Unterstrich und den Namen des Ereignisses kombiniert. Das Click-Ereignis einer Schaltfläche mit dem Namen button1 heißt beispielsweise Sub button1_Click.

Hinweis

Es wird empfohlen, diese Benennungskonvention beim Definieren von Ereignishandlern für Ihre eigenen Ereignisse zu verwenden, dies ist jedoch nicht erforderlich. Sie können einen beliebigen gültigen Unterroutinenamen verwenden.

Verknüpfen von Ereignissen mit Ereignishandlern

Bevor ein Ereignishandler verwendet werden kann, müssen Sie ihn zuerst einem Ereignis zuordnen, indem Sie entweder die Handles-Anweisung oder die AddHandler-Anweisung verwenden.

WithEvents und die Handles-Klausel

Die WithEvents Anweisung und Handles Klausel bieten eine deklarative Methode zum Angeben von Ereignishandlern. Ein Ereignis, das von einem mit dem WithEvents Schlüsselwort deklarierten Objekt ausgelöst wird, kann von jeder Prozedur mit einer Handles Anweisung für dieses Ereignis behandelt werden, wie im folgenden Beispiel gezeigt:

' 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 von ihnen verwendete deklarative Syntax die Ereignisbehandlung für Code, Lesen und Debuggen vereinfacht. Beachten Sie jedoch die folgenden Einschränkungen bei der Verwendung von WithEvents Variablen:

  • Sie können eine WithEvents Variable nicht als Objektvariable verwenden. Das heißt, Sie können sie nicht als Objectdeklarieren – Sie müssen den Klassennamen angeben, wenn Sie die Variable deklarieren.

  • Da freigegebene Ereignisse nicht an Klasseninstanzen gebunden sind, können Sie WithEvents nicht verwenden, um freigegebene Ereignisse deklarativ zu behandeln. Ebenso können Sie WithEvents oder Handles nicht verwenden, um Ereignisse von einem Structure zu verarbeiten. In beiden Fällen können Sie die AddHandler Anweisung verwenden, um diese Ereignisse zu behandeln.

  • Sie können keine Arrays von WithEvents Variablen erstellen.

WithEvents Variablen ermöglichen es einem einzelnen Ereignishandler, einen oder mehrere Ereignisarten zu behandeln, oder einen oder mehrere Ereignishandler, um dieselbe Art von Ereignis zu behandeln.

Obwohl die Handles Klausel die Standardmethode zum Zuordnen eines Ereignisses zu einem Ereignishandler ist, ist sie auf das Zuordnen von Ereignissen mit Ereignishandlern zur Kompilierungszeit beschränkt.

In einigen Fällen, z. B. mit Ereignissen, die Formularen oder Steuerelementen zugeordnet sind, führt Visual Basic automatisch einen leeren Ereignishandler aus und ordnet ihn einem Ereignis zu. Wenn Sie beispielsweise auf eine Befehlsschaltfläche in einem Formular im Entwurfsmodus doppelklicken, erstellt Visual Basic einen leeren Ereignishandler und eine WithEvents Variable für die Befehlsschaltfläche, wie im 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 darin, dass beide es ermöglichen, einen Ereignishandler festzulegen. Wird jedoch AddHandler in Verbindung mit RemoveHandler eingesetzt, bietet dies eine größere Flexibilität als die Handles-Klausel, sodass Sie den einem Ereignis zugeordneten Ereignishandler dynamisch hinzufügen, entfernen und ändern können. 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. Sie müssen die Delegatenklasse bei Verwendung AddHandlernicht explizit angeben, da die AddressOf Anweisung immer einen Verweis auf den Delegaten zurückgibt. Im folgenden Beispiel wird ein Ereignishandler einem Ereignis zugeordnet, das von einem Objekt ausgelöst wird:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, das ein Ereignis von einem Ereignishandler trennt, verwendet dieselbe Syntax wie AddHandler. Beispiel:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Im folgenden Beispiel wird ein Ereignishandler einem Ereignis 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. Wenn das Ereignis erneut ausgelöst wird, wird eine andere Meldung angezeigt.

Schließlich wird der zweite Ereignishandler entfernt, und das Ereignis wird ein drittes 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 von einer Basisklasse geerbt wurden

Abgeleitete Klassen – Klassen, die Merkmale von einer Basisklasse erben – können Ereignisse behandeln, die von ihrer Basisklasse mithilfe der Handles MyBase Anweisung ausgelöst werden.

So behandeln Sie Ereignisse aus einer Basisklasse

  • Deklarieren Sie einen Ereignishandler in der abgeleiteten Klasse, indem Sie der Deklarationszeile der Ereignishandlerprozedur eine Handles MyBase.Ereignisnameanweisung hinzufügen, wobei "eventname " der Name des Ereignisses in der basisklasse ist, die Sie behandeln. 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
    
Titel BESCHREIBUNG
Anleitung: Deklarieren und Auslösen von Ereignissen Enthält eine schrittweise Beschreibung der Deklaration und des Auslösens von Ereignissen für eine Klasse.
Anleitung: Umgang mit Ereignissen Veranschaulicht, wie eine Ereignishandlerprozedur geschrieben wird.
Vorgehensweise: Deklarieren von benutzerdefinierten Ereignissen, um die Blockierung zu vermeiden Veranschaulicht, wie ein benutzerdefiniertes Ereignis definiert wird, mit dem seine Ereignishandler asynchron aufgerufen werden können.
Vorgehensweise: Deklarieren von benutzerdefinierten Ereignissen zum Sparen von Arbeitsspeicher Veranschaulicht, wie ein benutzerdefiniertes Ereignis definiert wird, das nur Speicher verwendet, wenn das Ereignis behandelt wird.
Problembehandlung für geerbte Ereignishandler in Visual Basic Listet häufige Probleme auf, die mit Ereignishandlern in geerbten Komponenten auftreten.
Ereignisse Bietet eine Übersicht über das Ereignismodell in .NET Framework.
Erstellen von Ereignishandlern in Windows Forms Beschreibt das Arbeiten mit Ereignissen, die Windows Forms-Objekten zugeordnet sind.
Delegierte Bietet eine Übersicht über Delegaten in Visual Basic.