Freigeben über


<languageKeyword>Event</languageKeyword>-Anweisung

Aktualisiert: November 2007

Deklariert ein benutzerdefiniertes Ereignis.

[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _
[ Implements implementslist ]
' -or-
[ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Event eventname As delegatename _
[ Implements implementslist ]
' -or-
 [ <attrlist> ] [ accessmodifier ] _
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _
[ Implements implementslist ]
   [ <attrlist> ] AddHandler(ByVal value As delegatename)
      [ statements ]
   End AddHandler
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)
      [ statements ]
   End RemoveHandler
   [ <attrlist> ] RaiseEvent(delegatesignature)
      [ statements ]
   End RaiseEvent
End Event

Bestandteile

Bestandteil

Beschreibung

attrlist

Optional. Liste der Attribute, die für dieses Ereignis zutreffen. Mehrere Attribute werden durch Komma voneinander getrennt. Sie müssen die Attributliste in spitze Klammern ("<" und ">") einschließen.

accessmodifier

Optional. Gibt an, welcher Code auf das Ereignis zugreifen kann. Einer der folgenden Werte ist möglich:

  • Public – Code, der auf das Element zugreifen kann, das die Enumeration deklariert, kann darauf zugreifen.

  • Protected – Nur Code innerhalb seiner Klasse oder einer abgeleiteten Klasse kann darauf zugreifen.

  • Friend – Nur Code innerhalb der gleichen Assembly kann darauf zugreifen.

  • Private – Nur Code innerhalb des Elements, das es deklariert, kann darauf zugreifen.

Sie können Protected Friend angeben, um den Zugriff von Code innerhalb der Klasse des Ereignisses, innerhalb einer abgeleiteten Klasse oder innerhalb der gleichen Assembly zu ermöglichen.

Shared

Optional. Gibt an, dass dieses Ereignis keiner bestimmten Instanz einer Klasse oder Struktur zugeordnet ist.

Shadows

Optional. Gibt an, dass dieses Ereignis ein Programmierelement mit der gleichen Bezeichnung oder eine Gruppe überladener Elemente in einer Basisklasse erneut deklariert und ausblendet. Sie können jede Art von deklariertem Element mit einer anderen Art spiegeln.

Ein Element, für das ein solches Shadowing durchgeführt wurde, ist innerhalb der abgeleiteten Klasse, die das Shadowing durchführt, nicht verfügbar, es sei denn, auf das Element, welches das Shadowing durchführt, kann nicht zugegriffen werden. Wenn z. B. ein Private-Element ein Shadowing eines Basisklassenelements durchführt, greift Code ohne Zugriffsberechtigung für das Private-Element stattdessen auf das Basisklassenelement zu.

eventname

Erforderlich. Name des Ereignisses; entspricht den Standardnamenskonventionen für Variablen.

parameterlist

Optional. Liste von lokalen Variablen, die die Parameter dieses Ereignisses darstellen. Sie müssen die Parameterliste in Klammern einschließen.

Implements

Optional. Gibt an, dass dieses Ereignis ein Ereignis einer Schnittstelle implementiert.

implementslist

Erforderlich, wenn Implements angegeben wird. Liste der implementierten Sub-Prozeduren. Mehrere Prozeduren werden durch Komma getrennt:

implementedprocedure [ , implementedprocedure ... ]

Jede implementedprocedure hat folgende Syntax und folgende Bestandteile:

interface.definedname

BestandteilBeschreibung
interfaceErforderlich. Name einer Schnittstelle, die die enthaltende Klasse oder Struktur dieser Prozedur implementiert.
definednameErforderlich. Der Name, mit dem die Prozedur in interface definiert ist. Dieser muss nicht mit name, dem von dieser Prozedur zum Implementieren der definierten Prozedur verwendeten Namen, übereinstimmen.

Custom

Erforderlich. Als Custom deklarierte Ereignisse müssen einen benutzerdefinierten AddHandler-Accessor, RemoveHandler-Accessor und RaiseEvent-Accessor definieren.

delegatename

Optional. Der Name eines Delegaten, der die Signatur des Ereignishandlers angibt.

AddHandler

Erforderlich. Deklariert einen AddHandler-Accessor, der die beim Hinzufügen eines Ereignishandlers auszuführenden Anweisungen angibt, entweder explizit mit der AddHandler-Anweisung oder implizit mit der Handles-Klausel.

End AddHandler

Erforderlich. Beendet den AddHandler-Block.

value

Erforderlich. Parametername.

RemoveHandler

Erforderlich. Deklariert einen RemoveHandler-Accessor, der die Anweisungen angibt, die ausgeführt werden sollen, wenn ein Ereignishandler mit der RemoveHandler-Anweisung entfernt wird.

End RemoveHandler

Erforderlich. Beendet den RemoveHandler-Block.

RaiseEvent

Erforderlich. Deklariert einen RaiseEvent-Accessor, der die Anweisungen angibt, die ausgeführt werden sollen, wenn ein Ereignis mit der RaiseEvent-Anweisung ausgelöst wird. Normalerweise wird hierdurch eine Liste der Delegaten aufgerufen, die vom AddHandler-Accessor und vom RemoveHandler-Accessor verwaltet werden.

End RaiseEvent

Erforderlich. Beendet den RaiseEvent-Block.

delegatesignature

Erforderlich. Liste der Parameter, die den für den delegatename-Delegaten erforderlichen Parametern entsprechen. Sie müssen die Parameterliste in Klammern einschließen.

statements

Optional. Anweisungen, die den Text der AddHandler-Methode, der RemoveHandler-Methode und der RaiseEvent-Methode enthalten.

End Event

Erforderlich. Beendet den Event-Block.

Hinweise

Sobald das Ereignis einmal deklariert wurde, können Sie es mit der RaiseEvent-Anweisung auslösen. Ein typisches Ereignis kann wie im folgenden Beispiel deklariert und ausgelöst werden:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class
Hinweis:

Sie können Ereignisargumente auf dieselbe Weise wie Argumente von Prozeduren deklarieren, mit den folgenden Ausnahmen: Ereignisse dürfen keine benannten Argumente, ParamArray-Argumente oder Optional-Argumente haben. Ereignisse haben keine Rückgabewerte.

Um ein Ereignis zu behandeln, müssen Sie dieses mit der Handles-Anweisung oder der AddHandler-Anweisung der Unterroutine eines Ereignishandlers zuordnen. Die Signaturen der Unterroutine und des Ereignisses müssen übereinstimmen. Um ein freigegebenes Ereignis zu behandeln, müssen Sie die AddHandler-Anweisung verwenden.

Event kann nur auf Modulebene verwendet werden. Dies bedeutet, dass der Deklarationskontext für ein Ereignis eine Klasse, eine Struktur, ein Modul oder eine Schnittstelle sein muss und keine Quelldatei, kein Namespace, keine Prozedur und kein Block sein kann. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

In den meisten Fällen können Sie zum Deklarieren von Ereignissen die erste Syntax im Syntaxabschnitt dieses Themas verwenden. In einigen Szenarien muss jedoch das Verhalten des Ereignisses genauer gesteuert werden können. Die letzte Syntax im Syntaxabschnitt dieses Themas, die das Custom-Schlüsselwort verwendet, ermöglicht dies, da mit ihrer Hilfe benutzerdefinierte Ereignisse definiert werden können. In einem benutzerdefinierten Ereignis kann genau angegeben werden, was geschieht, wenn Code einen Ereignishandler einem Ereignis hinzufügt oder daraus entfernt, oder wenn das Ereignis von Code ausgelöst wird. Beispiele finden Sie unter Gewusst wie: Deklarieren von Ereignissen, die Speicherplatz sparen und Gewusst wie: Deklarieren von Ereignissen zum Vermeiden einer Blockierung.

Beispiel

Im folgenden Beispiel wird mithilfe von Ereignissen ein Countdown der Sekunden von 10 bis 0 ausgeführt. Der Code veranschaulicht mehrere ereignisbezogene Methoden, Eigenschaften und Anweisungen. Dies schließt die RaiseEvent-Anweisung ein.

Die Klasse, die ein Ereignis auslöst, ist die Ereignisquelle; die Methoden, die das Ereignis verarbeiten, sind die Ereignishandler. Eine Ereignisquelle kann mehrere Handler für die generierten Ereignisse haben. Löst die Klasse das Ereignis aus, so wird dieses Ereignis für jede Klasse ausgelöst, die Ereignisse für diese Instanz des Objekts verarbeitet.

Im Beispiel wird außerdem ein Formular (Form1) mit einer Schaltfläche (Button1) und einem Textfeld (TextBox1) verwendet. Wenn Sie auf die Schaltfläche klicken, wird im ersten Textfeld ein Countdown von 10 bis 0 Sekunden angezeigt. Nach Ablauf der vollständigen Zeitspanne (10 Sekunden) wird im ersten Textfeld "Done" angezeigt.

Der Code für Form1 gibt den Anfangs- und Endstatus des Formulars an. Darüber hinaus enthält er den Code, der beim Auslösen von Ereignissen ausgeführt wird.

Um dieses Beispiel zu verwenden, öffnen Sie ein neues Windows Forms-Projekt. Fügen Sie anschließend dem Hauptformular Form1 die Schaltfläche Button1 und das Textfeld TextBox1 hinzu. Klicken Sie anschließend mit der rechten Maustaste auf das Formular, und klicken Sie auf Code anzeigen, um den Code-Editor zu öffnen.

Fügen Sie dem Deklarationsabschnitt der Form1-Klasse eine WithEvents-Variable hinzu:

Private WithEvents mText As TimerState

Fügen Sie dem Code für Form1 den folgenden Code hinzu: Ersetzen Sie ggf. doppelte Prozeduren, z. B. Form_Load oder Button_Click.

Private Sub Form1_Load(ByVal sender As Object, _
                       ByVal e As System.EventArgs) _
                       Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double) _
                             Handles mText.UpdateTime
    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double, _
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Drücken Sie F5, um das vorherige Beispiel auszuführen, und klicken Sie auf die Schaltfläche Start. Im ersten Textfeld wird der Countdown der Sekunden gestartet. Nach Ablauf der vollständigen Zeitspanne (10 Sekunden) wird im ersten Textfeld "Done" angezeigt.

Hinweis:

Die My.Application.DoEvents-Methode verarbeitet Ereignisse nicht auf die gleiche Weise wie das Formular. Damit das Formular die Ereignisse direkt behandeln kann, können Sie Multithreading verwenden. Weitere Informationen finden Sie unter Multithreading in Visual Basic.

Siehe auch

Aufgaben

Gewusst wie: Hinzufügen von Ereignissen zu einer Klasse

Gewusst wie: Deklarieren von Ereignissen, die Speicherplatz sparen

Gewusst wie: Deklarieren von Ereignissen zum Vermeiden einer Blockierung

Referenz

RaiseEvent-Anweisung

Implements-Anweisung

AddHandler-Anweisung

RemoveHandler-Anweisung

Handles

Delegate-Anweisung

Shared (Visual Basic)

Shadows

Weitere Ressourcen

Ereignisse in Visual Basic