Händelser (Visual Basic)
Du kan visualisera ett Visual Studio projekt som en serie procedurer som körs i en sekvens, men i verkligheten är de flesta program händelsedrivna, vilket innebär att körningsflödet bestäms av externa förekomster som kallas händelser.
En händelse är en signal som informerar ett program om att något viktigt har inträffat. När en användare till exempel klickar på en kontroll i ett formulär kan formuläret utlösa en Click
händelse och anropa en procedur som hanterar händelsen. Händelser gör det också möjligt för separata uppgifter att kommunicera. Anta till exempel att ditt program utför en sorteringsuppgift separat från huvudprogrammet. Om en användare avbryter sorteringen kan ditt program skicka en avbokningshändelse som instruerar sorteringsprocessen att stoppa.
Villkor och begrepp för händelser
I det här avsnittet beskrivs de termer och begrepp som används med händelser i Visual Basic.
Deklarera händelser
Du deklarerar händelser i klasser, strukturer, moduler och gränssnitt med hjälp av nyckelordet Event
, som i följande exempel:
Event AnEvent(ByVal EventNumber As Integer)
Höjningshändelser
En händelse är som ett meddelande om att något viktigt har inträffat. Sändningen av meddelandet kallas för att höja evenemanget. I Visual Basic skapar du händelser med -instruktionenRaiseEvent
, som i följande exempel:
RaiseEvent AnEvent(EventNumber)
Händelser måste aktiveras inom omfånget för klassen, modulen eller strukturen där de deklareras. En härledd klass kan till exempel inte generera händelser som ärvts från en basklass.
Händelseavsändare
Alla objekt som kan skapa en händelse är en händelsesändare, även kallad händelsekälla. Formulär, kontroller och användardefinierade objekt är exempel på händelseavsändare.
Händelsehanterare
Händelsehanterare är procedurer som anropas när en motsvarande händelse inträffar. Du kan använda valfri giltig underrutin med en matchande signatur som händelsehanterare. Du kan dock inte använda en funktion som händelsehanterare eftersom den inte kan returnera ett värde till händelsekällan.
Visual Basic använder en standardnamnkonvention för händelsehanterare som kombinerar namnet på händelsesändaren, ett understreck och namnet på händelsen. Händelsen för Click
en knapp med namnet button1
får till exempel namnet Sub button1_Click
.
Anteckning
Vi rekommenderar att du använder den här namngivningskonventionen när du definierar händelsehanterare för dina egna händelser, men det krävs inte. du kan använda valfritt giltigt subrutinnamn.
Associera händelser med händelsehanterare
Innan en händelsehanterare kan användas måste du först associera den med en händelse med hjälp av instruktionen Handles
eller AddHandler
.
WithEvents och Handles-satsen
Instruktionen WithEvents
och Handles
-satsen är ett deklarativt sätt att ange händelsehanterare. En händelse som utlöses av ett objekt som deklarerats med nyckelordet WithEvents
kan hanteras av en procedur med en Handles
-instruktion för händelsen, som du ser i följande exempel:
' 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
Instruktionen WithEvents
Handles
och -satsen är ofta det bästa valet för händelsehanterare eftersom den deklarativa syntax de använder gör händelsehanteringen enklare att koda, läsa och felsöka. Tänk dock på följande begränsningar för användningen av WithEvents
variabler:
Du kan inte använda en
WithEvents
variabel som en objektvariabel. Det vill säga att du inte kan deklarera det somObject
– du måste ange klassnamnet när du deklarerar variabeln.Eftersom delade händelser inte är knutna till klassinstanser kan du inte använda
WithEvents
för att deklarativt hantera delade händelser. På samma sätt kan du inte användaWithEvents
ellerHandles
hantera händelser från enStructure
. I båda fallen kan du använda -instruktionenAddHandler
för att hantera dessa händelser.Du kan inte skapa matriser med
WithEvents
variabler.
WithEvents
Variabler gör att en enskild händelsehanterare kan hantera en eller flera typer av händelser, eller en eller flera händelsehanterare för att hantera samma typ av händelse.
Handles
Även om -satsen är standardsättet för att associera en händelse med en händelsehanterare, är den begränsad till att associera händelser med händelsehanterare vid kompileringen.
I vissa fall, till exempel med händelser som är associerade med formulär eller kontroller, Visual Basic automatiskt skicka ut en tom händelsehanterare och associerar den med en händelse. När du till exempel dubbelklickar på en kommandoknapp i ett formulär i designläge skapar Visual Basic en tom händelsehanterare och en WithEvents
variabel för kommandoknappen, som i följande kod:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
AddHandler och RemoveHandler
-instruktionen AddHandler
Handles
liknar -satsen i och med att båda gör att du kan ange en händelsehanterare. AddHandler
Men , som används med RemoveHandler
, ger större flexibilitet än Handles
-satsen, så att du dynamiskt kan lägga till, ta bort och ändra händelsehanteraren som är associerad med en händelse. Om du vill hantera delade händelser eller händelser från en struktur måste du använda AddHandler
.
AddHandler
tar två argument: namnet på en händelse från en händelsesändare, till exempel en kontroll, och ett uttryck som utvärderas till ett ombud. Du behöver inte uttryckligen ange ombudsklassen när du använder AddHandler
, eftersom -instruktionen AddressOf
alltid returnerar en referens till ombudet. I följande exempel associeras en händelsehanterare med en händelse som genereras av ett -objekt:
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler
, som kopplar bort en händelse från en händelsehanterare, använder samma syntax som AddHandler
. Ett exempel:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
I följande exempel är en händelsehanterare associerad med en händelse och händelsen aktiveras. Händelsehanteraren fångar upp händelsen och visar ett meddelande.
Sedan tas den första händelsehanteraren bort och en annan händelsehanterare associeras med händelsen. När händelsen aktiveras igen visas ett annat meddelande.
Slutligen tas den andra händelsehanteraren bort och händelsen aktiveras för tredje gången. Eftersom det inte längre finns en händelsehanterare som är associerad med händelsen vidtas ingen åtgärd.
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
Hantera händelser som ärvts från en basklass
Härledda klasser – klasser som ärver egenskaper från en basklass – kan hantera händelser som genereras av deras basklass med hjälp av -instruktionen Handles MyBase
.
Hantera händelser från en basklass
Deklarera en händelsehanterare i den härledda klassen genom att lägga till en
Handles MyBase.
eventname-instruktion på deklarationsraden i händelsehanterarproceduren, där eventname är namnet på händelsen i basklassen som du hanterar. Ett exempel: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
Närliggande avsnitt
Rubrik | Beskrivning |
---|---|
Genomgång: Deklarera och höja händelser | Innehåller en stegvis beskrivning av hur du deklarerar och genererar händelser för en klass. |
Genomgång: Hantera händelser | Visar hur du skriver en procedur för händelsehanterare. |
Anvisningar: Deklarera anpassade händelser för att undvika blockering | Visar hur du definierar en anpassad händelse som gör att dess händelsehanterare kan anropas asynkront. |
Anvisningar: Deklarera anpassade händelser för att spara minne | Visar hur du definierar en anpassad händelse som endast använder minne när händelsen hanteras. |
Felsöka ärvda händelsehanterare i Visual Basic | Visar en lista över vanliga problem som uppstår med händelsehanterare i ärvda komponenter. |
Händelser | Ger en översikt över händelsemodellen i .NET Framework. |
Skapa händelsehanterare i Windows Forms | Beskriver hur du arbetar med händelser som är associerade med Windows Forms objekt. |
Delegeringar | Ger en översikt över ombud i Visual Basic. |