Eventi (Visual Basic)Events (Visual Basic)

Sebbene sia possibile rappresentare graficamente un progetto di Visual Studio come una serie di procedure eseguite in sequenza, in realtà, la maggior parte dei programmi sono basata su eventi, vale a dire il flusso di esecuzione è determinato da occorrenze esterne denominate eventi.While you might visualize a Visual Studio project as a series of procedures that execute in a sequence, in reality, most programs are event driven—meaning the flow of execution is determined by external occurrences called events.

Un evento è un segnale che informa un'applicazione che si è verificato qualcosa di importante.An event is a signal that informs an application that something important has occurred. Ad esempio, quando un utente fa clic su un controllo in un form, il form può generare un evento Click e chiamare una routine che gestisce l'evento.For example, when a user clicks a control on a form, the form can raise a Click event and call a procedure that handles the event. Gli eventi consentono anche le comunicazioni tra attività separate.Events also allow separate tasks to communicate. Si supponga, ad esempio, che un'applicazione esegua un'attività di ordinamento separatamente dall'applicazione principale.Say, for example, that your application performs a sort task separately from the main application. Se un utente annulla l'ordinamento, l'applicazione può inviare un evento di annullamento per segnalare la necessità di interrompere il processo di ordinamento.If a user cancels the sort, your application can send a cancel event instructing the sort process to stop.

Termini e concetti relativi agli eventiEvent Terms and Concepts

In questa sezione vengono descritti i termini e concetti usati con gli eventi in Visual Basic.This section describes the terms and concepts used with events in Visual Basic.

Dichiarazione di eventiDeclaring Events

Gli eventi vengono dichiarati all'interno di classi, strutture, moduli e interfacce tramite la parola chiave Event, come nell'esempio seguente:You declare events within classes, structures, modules, and interfaces using the Event keyword, as in the following example:

Event AnEvent(ByVal EventNumber As Integer)

Generazione di eventiRaising Events

Un evento può essere paragonato a un messaggio che annuncia che si è verificato qualcosa di importante.An event is like a message announcing that something important has occurred. L'atto di trasmettere il messaggio viene definito generazione dell'evento.The act of broadcasting the message is called raising the event. In Visual Basic, è possibile generare gli eventi con il RaiseEvent istruzione, come nell'esempio seguente:In Visual Basic, you raise events with the RaiseEvent statement, as in the following example:

RaiseEvent AnEvent(EventNumber)

Gli eventi devono essere generati nell'ambito della classe, del modulo o della struttura in cui sono dichiarati.Events must be raised within the scope of the class, module, or structure where they are declared. Ad esempio, una classe derivata non può generare eventi ereditati da una classe di base.For example, a derived class cannot raise events inherited from a base class.

Mittenti di eventiEvent Senders

Qualsiasi oggetto in grado di generare un evento è un mittente di eventi, noto anche come origine di eventi.Any object capable of raising an event is an event sender, also known as an event source. I form, i controlli e gli oggetti definiti dall'utente sono alcuni esempi di mittenti di eventi.Forms, controls, and user-defined objects are examples of event senders.

Gestori eventiEvent Handlers

I gestori eventi sono le routine chiamate quando si verifica un evento corrispondente.Event handlers are procedures that are called when a corresponding event occurs. È possibile usare qualsiasi subroutine valida con una firma corrispondente come gestore eventi.You can use any valid subroutine with a matching signature as an event handler. Non è possibile usare una funzione come gestore eventi, tuttavia, perché non può restituire un valore all'origine di eventi.You cannot use a function as an event handler, however, because it cannot return a value to the event source.

Visual Basic Usa una convenzione di denominazione standard per i gestori di eventi che combina il nome del mittente dell'evento, un carattere di sottolineatura e il nome dell'evento.Visual Basic uses a standard naming convention for event handlers that combines the name of the event sender, an underscore, and the name of the event. Ad esempio, il nome dell'evento Click per un pulsante denominato button1 sarebbe Sub button1_Click.For example, the Click event of a button named button1 would be named Sub button1_Click.

Nota

È consigliabile usare questa convenzione di denominazione durante la definizione dei gestori per gli eventi personalizzati, ma non è obbligatorio. Si può usare qualsiasi nome di subroutine valido.We recommend that you use this naming convention when defining event handlers for your own events, but it is not required; you can use any valid subroutine name.

Associazione di eventi a gestori eventiAssociating Events with Event Handlers

Un gestore eventi diventa utilizzabile solo dopo averlo associato a un evento mediante l'istruzione Handles o AddHandler.Before an event handler becomes usable, you must first associate it with an event by using either the Handles or AddHandler statement.

WithEvents e clausola HandlesWithEvents and the Handles Clause

L'istruzione WithEvents e la clausola Handles offrono una modalità dichiarativa per specificare i gestori eventi.The WithEvents statement and Handles clause provide a declarative way of specifying event handlers. Un evento generato da un oggetto dichiarato con la parola chiave WithEvents può essere gestito da qualsiasi routine con un'istruzione Handles per tale evento, come illustrato nell'esempio seguente:An event raised by an object declared with the WithEvents keyword can be handled by any procedure with a Handles statement for that event, as shown in the following example:

' 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 clausola Handles rappresentano spesso la scelta migliore per i gestori eventi, perché la sintassi dichiarativa che usano semplifica la scrittura del codice, la lettura e il debug per la gestione degli eventi.The WithEvents statement and the Handles clause are often the best choice for event handlers because the declarative syntax they use makes event handling easier to code, read and debug. Tenere presenti, tuttavia, le limitazioni seguenti per l'uso delle variabili WithEvents:However, be aware of the following limitations on the use of WithEvents variables:

  • Non è possibile usare una variabile WithEvents come variabile oggetto,You cannot use a WithEvents variable as an object variable. ovvero non è possibile dichiararla come Object, ma è necessario specificare il nome della classe quando si dichiara la variabile.That is, you cannot declare it as Object—you must specify the class name when you declare the variable.

  • Poiché eventi condivisi non sono associati a istanze della classe, è possibile utilizzare WithEvents per gestire in modo dichiarativo eventi condivisi.Because shared events are not tied to class instances, you cannot use WithEvents to declaratively handle shared events. In modo analogo, non è possibile usare WithEvents o Handles per gestire gli eventi da Structure.Similarly, you cannot use WithEvents or Handles to handle events from a Structure. In entrambi i casi, è possibile usare l'istruzione AddHandler per gestire tali eventi.In both cases, you can use the AddHandler statement to handle those events.

  • Non è possibile creare matrici di variabili WithEvents.You cannot create arrays of WithEvents variables.

Le variabili WithEvents consentono a un unico gestore eventi di gestire uno o più tipi di evento oppure a uno o più gestori eventi di gestire lo stesso tipo di evento.WithEvents variables allow a single event handler to handle one or more kind of event, or one or more event handlers to handle the same kind of event.

Anche se la clausola Handles rappresenta la modalità standard per associare un evento a un gestore eventi, è limitata all'associazione di eventi a gestori eventi in fase di compilazione.Although the Handles clause is the standard way of associating an event with an event handler, it is limited to associating events with event handlers at compile time.

In alcuni casi, ad esempio gli eventi associati a form o controlli, Visual Basic automaticamente stub un gestore eventi vuoto e lo associa un evento.In some cases, such as with events associated with forms or controls, Visual Basic automatically stubs out an empty event handler and associates it with an event. Ad esempio, quando si fa doppio clic su un pulsante di comando in un form in modalità progettazione, Visual Basic crea un gestore eventi vuoto e un WithEvents variabile per il pulsante di comando, come nel codice seguente:For example, when you double-click a command button on a form in design mode, Visual Basic creates an empty event handler and a WithEvents variable for the command button, as in the following code:

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

AddHandler e RemoveHandlerAddHandler and RemoveHandler

L'istruzione AddHandler è simile alla clausola Handles, perché entrambe consentono di specificare un gestore eventi.The AddHandler statement is similar to the Handles clause in that both allow you to specify an event handler. Tuttavia, l'uso di AddHandler con RemoveHandler offre una maggiore flessibilità rispetto alla clausola Handles, perché consente di aggiungere, rimuovere e modificare dinamicamente il gestore eventi associato a un evento.However, AddHandler, used with RemoveHandler, provides greater flexibility than the Handles clause, allowing you to dynamically add, remove, and change the event handler associated with an event. Per gestire eventi condivisi o eventi da una struttura, è necessario usare AddHandler.If you want to handle shared events or events from a structure, you must use AddHandler.

AddHandler accetta due argomenti: il nome di un evento da un mittente di eventi, ad esempio un controllo e un'espressione che restituisce un delegato.AddHandler takes two arguments: the name of an event from an event sender such as a control, and an expression that evaluates to a delegate. Non è necessario specificare in modo esplicito la classe delegata quando si usa AddHandler, perché l'istruzione AddressOf restituisce sempre un riferimento al delegato.You do not need to explicitly specify the delegate class when using AddHandler, since the AddressOf statement always returns a reference to the delegate. L'esempio seguente associa un gestore eventi a un evento generato da un oggetto:The following example associates an event handler with an event raised by an object:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler, che disconnette un evento da un gestore eventi, usa la stessa sintassi di AddHandler.RemoveHandler, which disconnects an event from an event handler, uses the same syntax as AddHandler. Ad esempio:For example:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

Nell'esempio seguente un gestore eventi viene associato a un evento e l'evento viene generato.In the following example, an event handler is associated with an event, and the event is raised. Il gestore eventi intercetta l'evento e visualizza un messaggio.The event handler catches the event and displays a message.

Il primo gestore eventi viene quindi rimosso e all'evento viene associato un diverso gestore eventi.Then the first event handler is removed and a different event handler is associated with the event. Quando l'evento viene generato di nuovo, viene visualizzato un messaggio diverso.When the event is raised again, a different message is displayed.

Infine, il secondo gestore eventi viene rimosso e viene generato l'evento per una terza volta.Finally, the second event handler is removed and the event is raised for a third time. Dato che all'evento non è più associato un gestore eventi, non viene eseguita alcuna azione.Because there is no longer an event handler associated with the event, no action is taken.

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 di baseHandling Events Inherited from a Base Class

Le classi derivate, ovvero le classi che ereditano le caratteristiche da una classe di base, possono gestire gli eventi generati dalla rispettiva classe di base usando l'istruzione Handles MyBase.Derived classes—classes that inherit characteristics from a base class—can handle events raised by their base class using the Handles MyBase statement.

Per gestire gli eventi da una classe di baseTo handle events from a base class

  • Dichiarare un gestore eventi nella classe derivata aggiungendo un'istruzione Handles MyBase.nomeevento alla riga della dichiarazione della routine del gestore eventi, dove nomeevento è il nome dell'evento nella classe di base che si sta gestendo.Declare an event handler in the derived class by adding a Handles MyBase.eventname statement to the declaration line of your event-handler procedure, where eventname is the name of the event in the base class you are handling. Ad esempio:For example:

    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
    
TitoloTitle DescrizioneDescription
Procedura dettagliata: Dichiarazione e generazione di eventiWalkthrough: Declaring and Raising Events Descrizione dettagliata della procedura per dichiarare e generare eventi per una classe.Provides a step-by-step description of how to declare and raise events for a class.
Procedura dettagliata: Gestione degli eventiWalkthrough: Handling Events Illustra come scrivere una routine di gestore eventi.Demonstrates how to write an event-handler procedure.
Procedura: Dichiarare eventi personalizzati per evitare il bloccoHow to: Declare Custom Events To Avoid Blocking Illustra come definire un evento personalizzato che consente la chiamata asincrona dei gestori eventi.Demonstrates how to define a custom event that allows its event handlers to be called asynchronously.
Procedura: Dichiarare eventi personalizzati per proteggere la memoriaHow to: Declare Custom Events To Conserve Memory Illustra come definire un evento personalizzato che usa la memoria solo quando viene gestito l'evento.Demonstrates how to define a custom event that uses memory only when the event is handled.
Risoluzione dei problemi relativi ai gestori eventi ereditati in Visual BasicTroubleshooting Inherited Event Handlers in Visual Basic Elenca i problemi comuni che si verificano con i gestori eventi nei componenti ereditati.Lists common issues that arise with event handlers in inherited components.
EventiEvents Viene fornita una panoramica del modello di eventi usato in .NET Framework.Provides an overview of the event model in the .NET Framework.
Creazione di gestori eventi in Windows FormCreating Event Handlers in Windows Forms Descrive come usare gli eventi associati agli oggetti di Windows Form.Describes how to work with events associated with Windows Forms objects.
DelegatiDelegates Panoramica dei delegati in Visual Basic.Provides an overview of delegates in Visual Basic.