Dela via


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 skapa 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 inom klasser, strukturer, moduler och gränssnitt med hjälp av nyckelordet Event , som i följande exempel:

Event AnEvent(ByVal EventNumber As Integer)

Generering av händelser

En händelse är som ett meddelande om att något viktigt har inträffat. Att sända meddelandet kallas att höja händelsen. I Visual Basic skapar du händelser med -instruktionen RaiseEvent , som i följande exempel:

RaiseEvent AnEvent(EventNumber)

Händelser måste aktiveras inom omfånget för den klass, modul eller struktur 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 standardnamngivningskonvention för händelsehanterare som kombinerar namnet på händelsesändaren, ett understreck och namnet på händelsen. "Händelsen för en knapp med namnet Click skulle heta button1, till exempel Sub button1_Click."

Anmärkning

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-klausulen

Instruktionen WithEvents och Handles -satsen ger ett deklarativt sätt att ange händelsehanterare. En händelse som genereras 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 WithEventsHandles och -satsen är ofta det bästa valet för händelsehanterare eftersom den deklarativa syntax som de använder gör händelsehantering 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 som Object– 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ända WithEvents eller Handles hantera händelser från en Structure. I båda fallen kan du använda -instruktionen AddHandler för att hantera dessa händelser.

  • Du kan inte skapa matriser med WithEvents variabler.

WithEvents med variabler kan en enskild händelsehanterare 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 kompileringstillfället.

I vissa fall, till exempel med händelser som är associerade med formulär eller kontroller, bedövar Visual Basic automatiskt 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 liknar satsen Handles på så sätt att båda tillåter dig att specificera en händelsehanterare. Emellertid, AddHandler, när det används tillsammans med RemoveHandler, erbjuder större flexibilitet än Handles-satsen, vilket gör att du kan lägga till, ta bort och ändra händelsehanteraren dynamiskt 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 resulterar i en delegat. 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 från en händelse från en händelsehanterare, använder samma syntax som AddHandler. Till exempel:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

I följande exempel associeras en händelsehanterare med en händelse och händelsen aktiveras. Händelsehanteraren fångar 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 din händelsehanterarprocedur, där händelsenamn är namnet på händelsen i basklassen som du hanterar. Till 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
    
Titel Beskrivning
Genomgång: Deklarera och utlösa 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 händelsehanterarprocedur.
Gör så här: 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.
Gör så här: 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.
Evenemang 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.
Ombuden Ger en översikt över ombud i Visual Basic.