Event-Anweisung
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
Teile
Bestandteil |
Beschreibung |
attrlist |
Optional.Liste der Attribute, die für dieses Ereignis zutreffen.Mehrere Attribute werden durch Komma voneinander getrennt.Schließen Sie die Attributliste (Visual Basic) in spitzen Klammern ("<" und ">") ein. |
accessmodifier |
Optional.Gibt an, welcher Code auf das Ereignis zugreifen kann.Einer der folgenden Werte ist möglich:
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 mit jeder Art von deklarierten Elementen ein Shadowing einer anderen Art durchführen. Ein Element, für das ein 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 (Visual Basic) 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
interface Erforderlich.Name einer Schnittstelle, die die enthaltende Klasse oder Struktur dieser Prozedur implementiert.
definedname Erforderlich.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 (Visual Basic) 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 (Visual Basic).
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 zu diesem Thema finden Sie unter Gewusst wie: Deklarieren von benutzerdefinierten Ereignissen, um Speicherplatz zu sparen (Visual Basic) und Gewusst wie: Deklarieren von benutzerdefinierten Ereignissen, um eine Blockierung zu vermeiden (Visual Basic).
Beispiel
Im folgenden Beispiel dienen Ereignisse zum Herunterzählen von Sekunden von 10 bis 0.Im Code werden mehrere der ereignisbezogenen Methoden, Eigenschaften und Anweisungen veranschaulicht.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() Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click() 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 Threading (C# und Visual Basic). |
Siehe auch
Aufgaben
Referenz
Handles-Klausel (Visual Basic)