Istruzione EventEvent Statement

Dichiara un evento definito dall'utente.Declares a user-defined event.

SintassiSyntax

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

PartiParts

PartePart DescrizioneDescription
attrlist Facoltativo.Optional. Elenco degli attributi applicabili all'evento.List of attributes that apply to this event. Gli attributi sono separati da una virgola.Multiple attributes are separated by commas. È necessario racchiudere il elenco di attributi parentesi angolari ("<"e">").You must enclose the Attribute List in angle brackets ("<" and ">").
accessmodifier Facoltativo.Optional. Specifica il tipo di codice che può accedere all'evento.Specifies what code can access the event. Può essere uno dei seguenti:Can be one of the following:

- Pubblica: può accedere qualsiasi codice che possa accedere all'elemento che lo dichiara.- Public—any code that can access the element that declares it can access it.
- Protetto, ovvero solo codice all'interno di relativa classe o una classe derivata può accedervi.- Protected—only code within its class or a derived class can access it.
- Friend, ovvero solo codice nello stesso assembly può accedervi.- Friend—only code in the same assembly can access it.
- Privato: può accedere solo il codice nell'elemento che lo dichiara.- Private—only code in the element that declares it can access it.
- Protected Friend-solo codice nella classe dell'evento, una classe derivata o nello stesso assembly può accedervi.- Protected Friend-only code in the event's class, a derived class, or the same assembly can access it.
- Private Protected-solo codice nella classe dell'evento o una classe derivata nello stesso assembly può accedervi.- Private Protected-only code in the event's class or a derived class in the same assembly can access it.
Shared Facoltativo.Optional. Specifica che l'evento non è associato a una specifica istanza di una classe o di una struttura.Specifies that this event is not associated with a specific instance of a class or structure.
Shadows Facoltativo.Optional. Indica che l'evento ridichiara e nasconde un elemento di programmazione omonimo o un insieme di elementi in overload di una classe base.Indicates that this event redeclares and hides an identically named programming element, or set of overloaded elements, in a base class. È possibile nascondere qualsiasi tipo di elemento dichiarato con qualsiasi altro tipo.You can shadow any kind of declared element with any other kind.

Un elemento nascosto non è disponibile all'interno della classe derivata che lo nasconde, a meno che l'elemento di shadowing sia inaccessibile.A shadowed element is unavailable from within the derived class that shadows it, except from where the shadowing element is inaccessible. Ad esempio, se un elemento Private nasconde un elemento della classe base, il codice che non dispone dell'autorizzazione per accedere all'elemento Private accede invece all'elemento della classe base.For example, if a Private element shadows a base-class element, code that does not have permission to access the Private element accesses the base-class element instead.
eventname Obbligatorio.Required. Nome dell'evento, conforme alle convenzioni di denominazione standard delle variabili.Name of the event; follows standard variable naming conventions.
parameterlist Facoltativo.Optional. Elenco di variabili locali che rappresentano i parametri dell'evento.List of local variables that represent the parameters of this event. È necessario racchiudere il elenco di parametri racchiuso tra parentesi.You must enclose the Parameter List in parentheses.
Implements Facoltativo.Optional. Indica che l'evento implementa un evento di un'interfaccia.Indicates that this event implements an event of an interface.
implementslist Necessario se si fornisce Implements.Required if Implements is supplied. Elenco delle routine Sub implementate.List of Sub procedures being implemented. Nel caso di più routine, è possibile separarle mediante virgole.Multiple procedures are separated by commas:

implementedprocedure [, implementedprocedure ...]implementedprocedure [ , implementedprocedure ... ]

Ogni implementedprocedure presenta la sintassi e le parti seguenti:Each implementedprocedure has the following syntax and parts:

interface.definednameinterface.definedname

- interface -Obbligatorio.- interface - Required. Nome di un'interfaccia implementata dalla classe o dalla struttura che contiene la routine.Name of an interface that this procedure's containing class or structure is implementing.
- Definedname -Obbligatorio.- Definedname - Required. Nome mediante il quale la routine viene definita in interface.Name by which the procedure is defined in interface. Non è necessario che questo nome corrisponda al nome usato dalla routine per implementare la routine definita, ossia name.This does not have to be the same as name, the name that this procedure is using to implement the defined procedure.
Custom Obbligatorio.Required. È necessario che gli eventi dichiarati come Custom definiscano funzioni di accesso AddHandler, RemoveHandler e RaiseEvent personalizzate.Events declared as Custom must define custom AddHandler, RemoveHandler, and RaiseEvent accessors.
delegatename Facoltativo.Optional. Nome del delegato che specifica la firma del gestore eventi.The name of a delegate that specifies the event-handler signature.
AddHandler Obbligatorio.Required. Dichiara una funzione di accesso AddHandler che specifica le istruzioni da eseguire quando viene aggiunto un gestore eventi, sia in modo esplicito mediante l'istruzione AddHandler che in modo implicito mediante la clausola HandlesDeclares an AddHandler accessor, which specifies the statements to execute when an event handler is added, either explicitly by using the AddHandler statement or implicitly by using the Handles clause.
End AddHandler Obbligatorio.Required. Termina il blocco AddHandler.Terminates the AddHandler block.
value Obbligatorio.Required. Nome parametro.Parameter name.
RemoveHandler Obbligatorio.Required. Dichiara una funzione di accesso RemoveHandler, che specifica le istruzioni da eseguire quando un gestore eventi viene rimosso mediante l'istruzione RemoveHandler.Declares a RemoveHandler accessor, which specifies the statements to execute when an event handler is removed using the RemoveHandler statement.
End RemoveHandler Obbligatorio.Required. Termina il blocco RemoveHandler.Terminates the RemoveHandler block.
RaiseEvent Obbligatorio.Required. Dichiara una funzione di accesso RaiseEvent, che specifica le istruzioni da eseguire quando l'evento viene generato mediante l'istruzione RaiseEvent.Declares a RaiseEvent accessor, which specifies the statements to execute when the event is raised using the RaiseEvent statement. In genere, viene richiamato un elenco di delegati gestito dalle funzioni di accesso AddHandler e RemoveHandler.Typically, this invokes a list of delegates maintained by the AddHandler and RemoveHandler accessors.
End RaiseEvent Obbligatorio.Required. Termina il blocco RaiseEvent.Terminates the RaiseEvent block.
delegatesignature Obbligatorio.Required. Elenco di parametri che corrisponde ai parametri richiesti dal delegato delegatename.List of parameters that matches the parameters required by the delegatename delegate. È necessario racchiudere il elenco di parametri racchiuso tra parentesi.You must enclose the Parameter List in parentheses.
statements Facoltativo.Optional. Istruzioni che includono i corpi dei metodi AddHandler, RemoveHandler e RaiseEvent.Statements that contain the bodies of the AddHandler, RemoveHandler, and RaiseEvent methods.
End Event Obbligatorio.Required. Termina il blocco Event.Terminates the Event block.

NoteRemarks

Dopo aver dichiarato l'evento, usare l'istruzione RaiseEvent per generarlo.Once the event has been declared, use the RaiseEvent statement to raise the event. Nei frammenti seguenti viene mostrato un esempio tipico di dichiarazione e generazione di un evento:A typical event might be declared and raised as shown in the following fragments:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Nota

È possibile dichiarare argomenti per gli eventi analogamente a quanto avviene per gli argomenti di routine, tenendo però conto che non è possibile specificare per gli eventi argomenti denominati, argomenti ParamArray o argomenti Optional,You can declare event arguments just as you do arguments of procedures, with the following exceptions: events cannot have named arguments, ParamArray arguments, or Optional arguments. né ottenere da essi valori restituiti.Events do not have return values.

Per gestire un evento è necessario associarlo a una subroutine del gestore eventi mediante l'istruzione Handles o AddHandler.To handle an event, you must associate it with an event handler subroutine using either the Handles or AddHandler statement. Le firme della subroutine e dell'evento devono corrispondere.The signatures of the subroutine and the event must match. Per gestire un evento condiviso è necessario usare l'istruzione AddHandler.To handle a shared event, you must use the AddHandler statement.

Si può usare Event solo a livello di modulo.You can use Event only at module level. Ciò significa che il contesto della dichiarazione per un evento deve essere una classe, struttura, modulo o interfaccia e non può essere un file di origine, lo spazio dei nomi, procedura o blocco.This means the declaration context for an event must be a class, structure, module, or interface, and cannot be a source file, namespace, procedure, or block. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.For more information, see Declaration Contexts and Default Access Levels.

Nella maggior parte dei casi, per dichiarare un evento è possibile usare la prima sintassi nella sezione relativa alla sintassi di questo argomento.In most circumstances, you can use the first syntax in the Syntax section of this topic for declaring events. In alcuni scenari è tuttavia necessario disporre di un controllo maggiore sui dettagli del comportamento dell'evento.However, some scenarios require that you have more control over the detailed behavior of the event. L'ultima sintassi nella sezione relativa alla sintassi di questo argomento, che usa la parola chiave Custom, offre questa possibilità consentendo la definizione di eventi personalizzati.The last syntax in the Syntax section of this topic, which uses the Custom keyword, provides that control by enabling you to define custom events. In un evento personalizzato si specifica esattamente ciò che accade quando il codice aggiunge o rimuove un gestore eventi a o dall'evento oppure quando il codice genera l'evento.In a custom event, you specify exactly what occurs when code adds or removes an event handler to or from the event, or when code raises the event. Per esempi, vedere Procedura: Dichiarare eventi personalizzati per proteggere la memoria e come: Dichiarare eventi personalizzati per evitare il blocco.For examples, see How to: Declare Custom Events To Conserve Memory and How to: Declare Custom Events To Avoid Blocking.

EsempioExample

Negli esempi seguenti, gli eventi vengono usati per il conto alla rovescia dei secondi, da 10 a 0.The following example uses events to count down seconds from 10 to 0. Il codice illustra numerosi metodi, proprietà e istruzioni correlati agli eventi,The code illustrates several of the event-related methods, properties, and statements. inclusa l'istruzione RaiseEvent.This includes the RaiseEvent statement.

La classe che genera un evento viene definita origine e i metodi che lo elaborano vengono definiti gestori eventi.The class that raises an event is the event source, and the methods that process the event are the event handlers. Un'origine eventi può disporre di più gestori per gli eventi generati.An event source can have multiple handlers for the events it generates. Quando la classe genera l'evento, lo stesso evento viene generato in tutte le classi per cui è stato scelto di gestire eventi per tale istanza dell'oggetto.When the class raises the event, that event is raised on every class that has elected to handle events for that instance of the object.

Nell'esempio vengono usati anche un form (Form1) con un pulsante (Button1) e una casella di testo (TextBox1).The example also uses a form (Form1) with a button (Button1) and a text box (TextBox1). Quando si fa clic sul pulsante, nella prima casella di testo viene visualizzato il conto alla rovescia dei secondi da 10 a 0.When you click the button, the first text box displays a countdown from 10 to 0 seconds. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato "Done".When the full time (10 seconds) has elapsed, the first text box displays "Done".

Il codice di Form1 specifica gli stati di inizio e fine del form.The code for Form1 specifies the initial and terminal states of the form. Contiene inoltre il codice eseguito quando vengono generati gli eventi.It also contains the code executed when events are raised.

Per usare l'esempio, aprire un nuovo progetto Windows Form.To use this example, open a new Windows Forms project. Aggiungere quindi un pulsante denominato Button1 e una casella di testo denominata TextBox1 al form principale, denominato Form1.Then add a button named Button1 and a text box named TextBox1 to the main form, named Form1. Quindi fare clic sul form e fare clic su Visualizza codice per aprire l'editor di codice.Then right-click the form and click View Code to open the code editor.

Aggiungere una variabile WithEvents alla sezione delle dichiarazioni della classe Form1:Add a WithEvents variable to the declarations section of the Form1 class:

Private WithEvents mText As TimerState

Aggiungere il codice seguente al codice per Form1:Add the following code to the code for Form1. Sostituire eventuali routine duplicate, ad esempio Form_Load o Button_Click.Replace any duplicate procedures that may exist, such as Form_Load or Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double, 
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Premere F5 per eseguire l'esempio precedente, quindi fare clic sul pulsante con etichettato avviare.Press F5 to run the previous example, and click the button labeled Start. Nella prima casella di testo viene avviato il conto alla rovescia dei secondi.The first text box starts to count down the seconds. Al termine dei 10 secondi, nella prima casella di testo viene visualizzato "Done".When the full time (10 seconds) has elapsed, the first text box displays "Done".

Nota

Il metodo My.Application.DoEvents non elabora gli eventi allo stesso modo del form.The My.Application.DoEvents method does not process events in the same way the form does. Per consentire al form di gestire direttamente gli eventi, si può ricorrere al multithreading.To enable the form to handle the events directly, you can use multithreading. Per altre informazioni, vedere Managed Threading.For more information, see Managed Threading.

Vedere ancheSee also