Il parametro Vb.Net Sender ed e Event

In VB6, una subroutine di evento, come Button1_Click, era molto meno complicata perché il sistema chiamava la subroutine rigorosamente per nome. Se esisteva un evento Button1_Click, il sistema lo chiamava. È diretto e diretto.

Ma in VB.NET, ci sono due importanti aggiornamenti che rendono VB.NET SOOPercharged (che è "OOP" per la programmazione orientata agli oggetti).

  1. La clausola "Handles" controlla se il sistema chiama la subroutine, non il nome.
  2. I parametri mittente ed e vengono passati alla subroutine.

Uso dei parametri

Diamo un'occhiata a un semplice esempio per vedere la differenza che i parametri fanno in VB.NET.

Pulsante secondario privato1_Clicca ( 

 Mittente ByVal come System.Object,

 ByVal e As System.EventArgs

 ) Pulsante Maniglie1. Fare clic su

 'Il tuo codice va qui

End Sub

Le subroutine di eventi ricevono sempre un oggetto "mittente" e un parametro EventArgs di sistema "e". Poiché il parametro EventArgs è un oggetto, supporta qualsiasi proprietà e metodo sia necessario. Ad esempio, la vecchia subroutine di eventi MouseBove VB6 utilizzata per ricevere quattro parametri:

  • Pulsante come intero
  • Sposta come intero
  • X come singolo
  • Y come singolo

Quando i mouse più avanzati sono usciti con più pulsanti, VB6 ha avuto un vero problema nel supportarli. VB.NET passa solo un parametro MouseEventArgs ma supporta molte più proprietà e metodi. E ciascuno di essi sono oggetti che supportano ancora di più. Ad esempio, la proprietà e.Button contiene tutte queste proprietà:

  • Sinistra
  • mezzo
  • Giusto
  • Nessuna
  • XButton1
  • XButton2

Se qualcuno inventa un mouse "trancendental" con un pulsante "virtuale", VB.NET dovrà solo aggiornare .NET Framework per supportarlo e, di conseguenza, nessun codice precedente si interromperà.

Esistono numerose tecnologie .NET che dipendono assolutamente da questi parametri. Ad esempio, poiché il tuo PC di solito ha un solo schermo per visualizzare la grafica, il tuo codice deve unire la grafica che crea nella stessa immagine utilizzata da Windows. Per tale motivo, è necessario condividere un singolo oggetto "grafico". Il modo principale in cui il codice è in grado di utilizzare quell'oggetto "grafica" è utilizzare il parametro e che viene passato all'evento OnPaint con l'oggetto PaintEventArgs.

Protected Overrides Sub OnPaint (

 ByVal e As System.Windows.Forms.PaintEventArgs)

 Dim g As Graphics = e.Graphics

Altri esempi

Cos'altro puoi fare con questi parametri? Per illustrare, supponiamo che tu voglia scoprire se una stringa, forse qualcosa che hai inserito in una casella di testo, esiste in una qualsiasi di una raccolta di altre caselle di testo quando fai clic su una. Puoi codificare alcune dozzine di subroutine praticamente identiche per ogni casella di testo:

Se TextBox42.Text.IndexOf (

 SearchString.Text) = -1 

 Quindi NotFound.Text = 

 "Non trovato"

Ma è molto più facile codificarne solo uno e lasciarlo gestire tutti. Il parametro mittente rivelerà quale casella di testo è stata selezionata.

Sottotitoli privati ​​FindIt (

 Mittente ByVal come System.Object,

 ByVal e As System.EventArgs

 ) Gestisce TextBox1.Enter, 

 TextBox2.Enter, 

... e ancora e ancora ... 

 TextBox42.Enter

 Dim myTextbox As TextBox

 myTextbox = mittente

 Dim IndexChar As Intero = 

 myTextbox.Text.IndexOf ( 

 SearchString.Text)

 Se IndexChar = -1, allora _

 NotFound.Text = "Non trovato" _

 Altro _

 NotFound.Text = "Found It!"

 End Sub

Di recente, un programmatore mi ha chiesto un modo migliore per "eliminare la riga su cui è stato fatto clic in uno dei sei elenchi specificati". L'ha fatto funzionare in un paio di dozzine di righe di codice che mi hanno semplicemente confuso. Ma usando il mittente, era davvero abbastanza semplice:

Elenco secondario privatoBox_Click ( 

 Mittente ByVal come oggetto, 

 ByVal e As System.EventArgs

 ) Gestisce ListBox1.Click, ListBox2.Click

 Dim myListBox come nuovo ListBox

 myListBox = mittente

 myListBox.Items.RemoveAt (myListBox.SelectedIndex)

End Sub

Un altro esempio per chiarire il punto è una domanda che è stata inviata da Pierre in Belgio. Pierre stava testando l'uguaglianza di Button1 e del mittente usando il È operatore per oggetti:

Se il mittente è Button1, allora ... 

Ciò è sintatticamente corretto perché mittente e Button1 sono entrambi oggetti a cui è possibile fare riferimento. E poiché il mittente è davvero identico a Button1, perché non funziona?

La risposta dipende da una parola chiave che si trova poco prima nell'istruzione. Innanzitutto, controlliamo la documentazione Microsoft per il È operatore.

Visual Basic confronta due variabili di riferimento all'oggetto con l'operatore Is. Questo operatore determina se due variabili di riferimento si riferiscono alla stessa istanza di oggetto.

Si noti che il mittente è stato superato ByVal. Ciò significa che viene passata una copia di Button1, non l'oggetto reale stesso. Quindi, quando Pierre verifica se mittente e Button1 sono la stessa istanza, il risultato è Falso.

Per verificare se è stato fatto clic su Button1 o Button2, è necessario trasformare il mittente in un oggetto Button effettivo e quindi testare una proprietà di tale oggetto. Di solito viene utilizzato il testo, ma è possibile verificare un valore in Tag o anche nella proprietà Location.

Questo codice funziona:

Dim myButton come pulsante

myButton = mittente

Se myButton.Text = "Button1" Quindi