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 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 WithEventsHandles 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 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 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 AddHandlerHandles liknar -satsen i och med att båda gör att du kan ange en händelsehanterare. AddHandlerMen , 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
    
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.