Condividi tramite


Eventi (Visual Basic)

Sebbene sia possibile visualizzare un progetto di Visual Studio come una serie di procedure eseguite in una sequenza, in realtà la maggior parte dei programmi è guidata dagli eventi, il che significa che il flusso di esecuzione è determinato da occorrenze esterne chiamate eventi.

Un evento è un segnale che informa un'applicazione che si è verificato un evento importante. Ad esempio, quando un utente fa clic su un controllo in una maschera, la maschera può generare un Click evento e chiamare una procedura che gestisce l'evento. Gli eventi consentono anche di comunicare attività separate. Si supponga, ad esempio, che l'applicazione esegua un'attività di ordinamento separatamente dall'applicazione principale. Se un utente annulla l'ordinamento, l'applicazione può inviare un evento di annullamento che indica all'utente di arrestare il processo di ordinamento.

Termini e concetti dell'evento

In questa sezione vengono descritti i termini e i concetti usati con gli eventi in Visual Basic.

Dichiarazione di eventi

Si dichiarano eventi all'interno di classi, strutture, moduli e interfacce usando la Event parola chiave , come nell'esempio seguente:

Event AnEvent(ByVal EventNumber As Integer)

Generazione di eventi

Un evento è simile a un messaggio che annuncia che si è verificato un evento importante. L'azione di trasmissione del messaggio viene chiamata innalzamento dell'evento. In Visual Basic si generano eventi con l'istruzione RaiseEvent , come nell'esempio seguente:

RaiseEvent AnEvent(EventNumber)

Gli eventi devono essere generati all'interno dell'ambito della classe, del modulo o della struttura in cui sono dichiarati. Ad esempio, una classe derivata non può generare eventi ereditati da una classe di base.

Generatori di eventi

Qualsiasi oggetto in grado di generare un evento è un mittente di eventi, noto anche come origine evento. Moduli, controlli e oggetti definiti dall'utente sono esempi di mittenti di eventi.

Gestori eventi

I gestori eventi sono procedure chiamate quando si verifica un evento corrispondente. È possibile usare qualsiasi subroutine valida con una firma corrispondente come gestore eventi. Non è tuttavia possibile usare una funzione come gestore eventi, perché non può restituire un valore all'origine evento.

Visual Basic usa una convenzione di denominazione standard per i gestori eventi che combina il nome del mittente dell'evento, un carattere di sottolineatura e il nome dell'evento. Ad esempio, l'evento Click di un pulsante denominato button1 sarà denominato Sub button1_Click.

Annotazioni

È consigliabile usare questa convenzione di denominazione quando si definiscono i gestori eventi per gli eventi personalizzati, ma non è obbligatorio; è possibile usare qualsiasi nome di subroutine valido.

Associazione di eventi con i gestori di eventi

Prima che un gestore eventi diventi utilizzabile, è necessario associarlo a un evento usando l'istruzione Handles o AddHandler .

WithEvents e la clausola Handles

L'istruzione WithEvents e la clausola Handles forniscono un modo dichiarativo per specificare i gestori di eventi. Un evento generato da un oggetto dichiarato con la WithEvents parola chiave può essere gestito da qualsiasi routine con un'istruzione Handles per tale evento, come illustrato nell'esempio seguente:

' 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

L'istruzione WithEvents e la Handles clausola sono spesso la scelta migliore per i gestori eventi perché la sintassi dichiarativa usata rende la gestione degli eventi più semplice da scrivere, leggere ed eseguire il debug. Tuttavia, tenere presente le limitazioni seguenti sull'uso delle WithEvents variabili:

  • Non è possibile usare una WithEvents variabile come variabile oggetto. Ciò significa che non è possibile dichiararlo come Object, è necessario specificare il nome della classe quando si dichiara la variabile.

  • Poiché gli eventi condivisi non sono associati alle istanze di classe, non è possibile usare WithEvents per gestire in modo dichiarativo gli eventi condivisi. Analogamente, non è possibile usare WithEvents o Handles per gestire gli eventi da un oggetto Structure. In entrambi i casi, è possibile usare l'istruzione AddHandler per gestire tali eventi.

  • Non è possibile creare matrici di WithEvents variabili.

WithEvents Le variabili consentono a un singolo gestore eventi di gestire uno o più tipi di evento o uno o più gestori eventi per gestire lo stesso tipo di evento.

Sebbene la Handles clausola sia il modo standard di associare un evento a un gestore eventi, è limitato all'associazione di eventi ai gestori eventi in fase di compilazione.

In alcuni casi, ad esempio con gli eventi associati a maschere o controlli, Visual Basic genera automaticamente uno stub per un gestore eventi vuoto e lo associa all'evento. Ad esempio, quando si fa doppio clic su un pulsante di comando su un modulo in modalità progettazione, Visual Basic crea un gestore eventi vuoto e una variabile WithEvents associata al pulsante di comando, come nel codice seguente:

Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler e RemoveHandler

L'istruzione AddHandler è simile alla clausola Handles in quanto entrambe consentono di specificare un gestore di eventi. Tuttavia, , AddHandlerusato con RemoveHandler, offre maggiore flessibilità rispetto alla Handles clausola , consentendo di aggiungere, rimuovere e modificare in modo dinamico il gestore eventi associato a un evento. Se si desidera gestire eventi o eventi condivisi da una struttura, è necessario usare AddHandler.

AddHandler accetta due argomenti: il nome di un evento da un emittente di eventi come un controllo, e un'espressione che valuta un delegato. Non è necessario specificare in modo esplicito la classe delegato quando si usa AddHandler, perché l'istruzione AddressOf restituisce sempre un riferimento al delegato. Nell'esempio seguente un gestore eventi viene associato a un evento generato da un oggetto :

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, che disconnette un evento da un gestore eventi, usa la stessa sintassi di AddHandler. Per esempio:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Nell'esempio seguente un gestore eventi è associato a un evento e l'evento viene generato. Il gestore eventi intercetta l'evento e visualizza un messaggio.

Il primo gestore eventi viene quindi rimosso e all'evento è associato un gestore eventi diverso. Quando l'evento viene generato di nuovo, viene visualizzato un messaggio diverso.

Infine, il secondo gestore eventi viene rimosso e l'evento viene generato per una terza volta. Poiché non esiste più un gestore eventi associato all'evento, non viene eseguita alcuna azione.

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

Gestione degli eventi ereditati da una classe base

Le classi derivate, classi che ereditano caratteristiche da una classe di base, possono gestire gli eventi generati dalla relativa classe di base usando l'istruzione Handles MyBase .

Per gestire gli eventi da una classe di base

  • Dichiarare un gestore eventi nella classe derivata aggiungendo un'istruzione Handles MyBase.eventname alla riga di dichiarazione della routine del gestore eventi, dove eventname è il nome dell'evento nella classe base che si sta gestendo. Per esempio:

    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
    
Titolo Descrizione
Procedura dettagliata: Dichiarazione e generazione di eventi Fornisce una descrizione dettagliata di come dichiarare e generare eventi per una classe.
Procedura dettagliata: Gestione degli eventi Illustra come scrivere una routine del gestore eventi.
Procedura: Dichiarare eventi personalizzati per evitare il blocco Illustra come definire un evento personalizzato che consenta la chiamata asincrona dei gestori eventi.
Procedura: Dichiarare eventi personalizzati per risparmiare memoria Viene illustrato come definire un evento personalizzato che usa la memoria solo quando l'evento viene gestito.
Risoluzione dei Problemi dei Gestori Eventi Ereditati in Visual Basic Elenca i problemi comuni che si verificano con i gestori eventi nei componenti ereditati.
Avvenimenti Fornisce una panoramica del modello di eventi in .NET Framework.
Creazione di gestori eventi in Windows Form Viene descritto come utilizzare gli eventi associati agli oggetti Windows Form.
Delegati Fornisce una panoramica dei delegati in Visual Basic.