Procedura dettagliata: Gestione degli eventi (Visual Basic)Walkthrough: Handling Events (Visual Basic)

Questo è il secondo di due argomenti in cui viene illustrato come utilizzare gli eventi.This is the second of two topics that demonstrate how to work with events. Il primo argomento, procedura dettagliata: Dichiarazione e generazione di eventi, Mostra come dichiarare e generare eventi.The first topic, Walkthrough: Declaring and Raising Events, shows how to declare and raise events. In questa sezione vengono usati il form e la classe di questa procedura dettagliata per illustrare come gestire gli eventi quando si verificano.This section uses the form and class from that walkthrough to show how to handle events when they take place.

Nell' Widget esempio di classe vengono utilizzate istruzioni tradizionali di gestione degli eventi.The Widget class example uses traditional event-handling statements. Visual Basic fornisce altre tecniche per l'utilizzo degli eventi.Visual Basic provides other techniques for working with events. Come esercizio, è possibile modificare questo esempio per usare le AddHandler istruzioni e. HandlesAs an exercise, you can modify this example to use the AddHandler and Handles statements.

Per gestire l'evento PercentDone della classe widgetTo handle the PercentDone event of the Widget class

  1. Inserire il codice seguente in Form1:Place the following code in Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    La WithEvents parola chiave specifica che la mWidget variabile viene utilizzata per gestire gli eventi di un oggetto.The WithEvents keyword specifies that the variable mWidget is used to handle an object's events. Specificare il tipo di oggetto fornendo il nome della classe da cui verrà creato l'oggetto.You specify the kind of object by supplying the name of the class from which the object will be created.

    La variabile mWidget è dichiarata WithEvents in perché le variabili devono essere a livello di Form1 classe.The variable mWidget is declared in Form1 because WithEvents variables must be class-level. Questo vale indipendentemente dal tipo di classe in cui vengono inserite.This is true regardless of the type of class you place them in.

    La variabile mblnCancel viene usata per annullare il LongTask metodo.The variable mblnCancel is used to cancel the LongTask method.

Scrittura di codice per la gestione di un eventoWriting Code to Handle an Event

Non appena si dichiara una variabile usando WithEvents, il nome della variabile viene visualizzato nell'elenco a discesa a sinistra dell'editor di codicedella classe.As soon as you declare a variable using WithEvents, the variable name appears in the left drop-down list of the class's Code Editor. Quando si seleziona mWidget, gli Widget eventi della classe vengono visualizzati nell'elenco a discesa a destra.When you select mWidget, the Widget class's events appear in the right drop-down list. Se si seleziona un evento, viene visualizzata la routine evento corrispondente mWidget con il prefisso e un carattere di sottolineatura.Selecting an event displays the corresponding event procedure, with the prefix mWidget and an underscore. A tutte le routine di evento associate WithEvents a una variabile viene assegnato il nome della variabile come prefisso.All the event procedures associated with a WithEvents variable are given the variable name as a prefix.

Per gestire un eventoTo handle an event

  1. Selezionare mWidget dall'elenco a discesa a sinistra nell'editor di codice.Select mWidget from the left drop-down list in the Code Editor.

  2. Selezionare l' PercentDone evento dall'elenco a discesa a destra.Select the PercentDone event from the right drop-down list. Nell' editor di codice viene mWidget_PercentDone aperta la routine evento.The Code Editor opens the mWidget_PercentDone event procedure.

    Nota

    L' editor di codice è utile, ma non obbligatorio, per l'inserimento di nuovi gestori di eventi.The Code Editor is useful, but not required, for inserting new event handlers. In questa procedura dettagliata è più diretto copiare semplicemente i gestori eventi direttamente nel codice.In this walkthrough, it is more direct to just copy the event handlers directly into your code.

  3. Aggiungere il codice seguente al gestore eventi mWidget_PercentDone :Add the following code to the mWidget_PercentDone event handler:

    Private Sub mWidget_PercentDone( 
        ByVal Percent As Single, 
        ByRef Cancel As Boolean 
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    Ogni volta PercentDone che viene generato l'evento, nella routine dell'evento viene visualizzata la Label percentuale di completamento in un controllo.Whenever the PercentDone event is raised, the event procedure displays the percent complete in a Label control. Il DoEvents metodo consente di ridisegnare l'etichetta e offre all'utente anche la possibilità di fare clic sul pulsante Annulla .The DoEvents method allows the label to repaint, and also gives the user the opportunity to click the Cancel button.

  4. Aggiungere il codice seguente per il Button2_Click gestore eventi:Add the following code for the Button2_Click event handler:

    Private Sub Button2_Click( 
        ByVal sender As Object, 
        ByVal e As System.EventArgs 
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

Se l'utente fa clic sul pulsante Annulla LongTask mentre è in esecuzione Button2_Click , l'evento viene eseguito non appena DoEvents l'istruzione consente l'elaborazione di eventi.If the user clicks the Cancel button while LongTask is running, the Button2_Click event is executed as soon as the DoEvents statement allows event processing to occur. La variabile mblnCancel a livello di classe è impostata Truesu e l' mWidget_PercentDone evento lo testa e imposta l' ByRef Cancel argomento su True.The class-level variable mblnCancel is set to True, and the mWidget_PercentDone event then tests it and sets the ByRef Cancel argument to True.

Connessione di una variabile WithEvents a un oggettoConnecting a WithEvents Variable to an Object

Form1è ora configurato per gestire gli eventi Widget di un oggetto.Form1 is now set up to handle a Widget object's events. Tutto ciò che rimane è trovare un Widget punto.All that remains is to find a Widget somewhere.

Quando si dichiara una variabile WithEvents in fase di progettazione, non vi è alcun oggetto associato.When you declare a variable WithEvents at design time, no object is associated with it. Una WithEvents variabile è analoga a qualsiasi altra variabile oggetto.A WithEvents variable is just like any other object variable. È necessario creare un oggetto e assegnarvi un riferimento con la WithEvents variabile.You have to create an object and assign a reference to it with the WithEvents variable.

Per creare un oggetto e assegnarvi un riferimentoTo create an object and assign a reference to it

  1. Selezionare (eventi Form1) nell'elenco a discesa a sinistra nell'editor di codice.Select (Form1 Events) from the left drop-down list in the Code Editor.

  2. Selezionare l' Load evento dall'elenco a discesa a destra.Select the Load event from the right drop-down list. Nell' editor di codice viene Form1_Load aperta la routine evento.The Code Editor opens the Form1_Load event procedure.

  3. Aggiungere il codice seguente per la Form1_Load routine evento per Widgetcreare:Add the following code for the Form1_Load event procedure to create the Widget:

    Private Sub Form1_Load( 
        ByVal sender As System.Object, 
        ByVal e As System.EventArgs 
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

Quando questo codice viene eseguito, Visual Basic crea un Widget oggetto e connette i relativi eventi alle routine di evento associate mWidgeta.When this code executes, Visual Basic creates a Widget object and connects its events to the event procedures associated with mWidget. Da quel momento in poi, ogni Widget volta che PercentDone il genera l' mWidget_PercentDone evento, viene eseguita la routine dell'evento.From that point on, whenever the Widget raises its PercentDone event, the mWidget_PercentDone event procedure is executed.

Per chiamare il metodo LongTaskTo call the LongTask method

  • Aggiungere il codice seguente al gestore eventi Button1_Click :Add the following code to the Button1_Click event handler:

    Private Sub Button1_Click( 
        ByVal sender As Object, 
        ByVal e As System.EventArgs 
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

Prima che LongTask venga chiamato il metodo, l'etichetta che visualizza la percentuale di completamento deve essere inizializzata e il flag Boolean a livello di classe per l'annullamento del metodo deve Falseessere impostato su.Before the LongTask method is called, the label that displays the percent complete must be initialized, and the class-level Boolean flag for canceling the method must be set to False.

LongTaskviene chiamato con una durata dell'attività di 12,2 secondi.LongTask is called with a task duration of 12.2 seconds. L' PercentDone evento viene generato una volta ogni un terzo di un secondo.The PercentDone event is raised once every one-third of a second. Ogni volta che viene generato l'evento, mWidget_PercentDone viene eseguita la routine dell'evento.Each time the event is raised, the mWidget_PercentDone event procedure is executed.

mblnCancel LongTask mblnCancel Al termine, viene testato per verificare se è terminato normalmente o se è stato interrotto perché è stato impostato Truesu. LongTaskWhen LongTask is done, mblnCancel is tested to see if LongTask ended normally, or if it stopped because mblnCancel was set to True. La percentuale di completamento viene aggiornata solo nel caso precedente.The percent complete is updated only in the former case.

Per eseguire il programmaTo run the program

  1. Premere F5 per inserire il progetto in modalità di esecuzione.Press F5 to put the project in run mode.

  2. Fare clic sul pulsante Avvia attività .Click the Start Task button. Ogni volta che PercentDone viene generato l'evento, l'etichetta viene aggiornata con la percentuale dell'attività completata.Each time the PercentDone event is raised, the label is updated with the percentage of the task that is complete.

  3. Fare clic sul pulsante Annulla per arrestare l'attività.Click the Cancel button to stop the task. Si noti che l'aspetto del pulsante Annulla non viene modificato immediatamente quando si fa clic su di esso.Notice that the appearance of the Cancel button does not change immediately when you click it. L' Click evento non può verificarsi fino My.Application.DoEvents a quando l'istruzione non consente l'elaborazione di eventi.The Click event cannot happen until the My.Application.DoEvents statement allows event processing.

    Nota

    Il My.Application.DoEvents metodo non elabora gli eventi esattamente allo stesso modo del modulo.The My.Application.DoEvents method does not process events in exactly the same way as the form does. In questa procedura dettagliata, ad esempio, è necessario fare clic due volte sul pulsante Annulla .For example, in this walkthrough, you must click the Cancel button twice. Per consentire al modulo di gestire direttamente gli eventi, è possibile utilizzare il multithreading.To allow the form to handle the events directly, you can use multithreading. Per altre informazioni, vedere Threading gestito.For more information, see Managed Threading.

Potrebbe risultare istruttivo eseguire il programma con F11 e scorrere il codice una riga alla volta.You may find it instructive to run the program with F11 and step through the code a line at a time. È possibile vedere chiaramente il modo in LongTaskcui l'esecuzione entra, quindi immettere Form1 di nuovo brevemente PercentDone ogni volta che viene generato l'evento.You can clearly see how execution enters LongTask, and then briefly re-enters Form1 each time the PercentDone event is raised.

Cosa accadrebbe se, durante l'esecuzione fosse tornato nel codice di Form1, il LongTask metodo veniva chiamato di nuovo?What would happen if, while execution was back in the code of Form1, the LongTask method were called again? Al peggiore, potrebbe verificarsi un overflow dello stack LongTask se venivano chiamati ogni volta che l'evento è stato generato.At worst, a stack overflow might occur if LongTask were called every time the event was raised.

È possibile fare in modo mWidget che la variabile gestisca gli Widget eventi per un oggetto diverso assegnando un riferimento Widget al mWidgetnuovo a.You can cause the variable mWidget to handle events for a different Widget object by assigning a reference to the new Widget to mWidget. In realtà, è possibile fare in Button1_Click modo che il codice esegua questa operazione ogni volta che si fa clic sul pulsante.In fact, you can make the code in Button1_Click do this every time you click the button.

Per gestire gli eventi per un widget diversoTo handle events for a different widget

  • Aggiungere la seguente riga di codice alla Button1_Click procedura, immediatamente prima della riga che legge: mWidget.LongTask(12.2, 0.33)Add the following line of code to the Button1_Click procedure, immediately preceding the line that reads mWidget.LongTask(12.2, 0.33):

    mWidget = New Widget
    ' Create a new Widget object.
    

Il codice precedente crea un nuovo Widget oggetto ogni volta che si fa clic sul pulsante.The code above creates a new Widget each time the button is clicked. Non appena il LongTask metodo viene completato, il riferimento all'oggetto Widget Widget viene rilasciato e viene eliminato definitivamente.As soon as the LongTask method completes, the reference to the Widget is released, and the Widget is destroyed.

Una WithEvents variabile può contenere solo un riferimento a un oggetto alla volta, pertanto se si assegna un Widget oggetto diverso mWidgeta, gli Widget eventi dell'oggetto precedente non verranno più gestiti.A WithEvents variable can contain only one object reference at a time, so if you assign a different Widget object to mWidget, the previous Widget object's events will no longer be handled. Se mWidget è l'unica variabile oggetto contenente un riferimento al precedente Widget, l'oggetto viene eliminato definitivamente.If mWidget is the only object variable containing a reference to the old Widget, the object is destroyed. Se si desidera gestire gli eventi di diversi Widget oggetti, utilizzare l' AddHandler istruzione per elaborare separatamente gli eventi da ogni oggetto.If you want to handle events from several Widget objects, use the AddHandler statement to process events from each object separately.

Nota

È possibile dichiarare il numero WithEvents di variabili necessario, ma le matrici di WithEvents variabili non sono supportate.You can declare as many WithEvents variables as you need, but arrays of WithEvents variables are not supported.

Vedere ancheSee also