Los parámetros de Vb.Net Sender y e Event

En VB6, una subrutina de eventos, como Button1_Click, era mucho menos complicada porque el sistema llamaba a la subrutina estrictamente por su nombre. Si existió un evento Button1_Click, el sistema lo llamó. Es directo y directo.

Pero en VB.NET, hay dos actualizaciones principales que hacen que VB.NET SOOPercharged (eso es "OOP" para la programación orientada a objetos).

  1. La cláusula "Handles" controla si el sistema llama a la subrutina, no al nombre.
  2. Los parámetros emisor y e se pasan a la subrutina.

Uso de parámetros

Veamos un ejemplo simple para ver la diferencia que hacen los parámetros en VB.NET.

Private Sub Button1_Click ( 

 Remitente ByVal como System.Object,

 ByVal e As System.EventArgs

 ) Botón de manijas 1.Haga clic en

 'Tu código va aquí

End Sub

Las subrutinas de eventos siempre reciben un objeto "remitente" y un parámetro de sistema EventArgs "e". Debido a que el parámetro EventArgs es un objeto, admite todas las propiedades y métodos necesarios. Por ejemplo, la antigua subrutina de evento VB6 MouseMove solía recibir cuatro parámetros:

  • Botón como entero
  • Shift As Integer
  • X como soltero
  • Y como soltero

Cuando los ratones más avanzados salieron con más botones, VB6 tuvo un problema real para soportarlos. VB.NET solo pasa un parámetro MouseEventArgs, pero admite muchas más propiedades y métodos. Y cada uno de ellos son objetos que soportan aún más. Por ejemplo, la propiedad e.Button contiene todas estas propiedades:

  • Izquierda
  • Medio
  • Derecho
  • Ninguna
  • XButton1
  • XButton2

Si alguien inventa un mouse "trancendental" con un botón "virtual", VB.NET solo tendrá que actualizar .NET Framework para admitirlo y, como resultado, no se romperá ningún código anterior..

Hay una serie de tecnologías .NET que dependen absolutamente de estos parámetros. Por ejemplo, dado que su PC generalmente solo tiene una sola pantalla para mostrar gráficos, su código tiene que fusionar los gráficos que crea en la misma imagen utilizada por Windows. Por esa razón, se debe compartir un solo objeto "gráfico". La forma principal en que su código puede usar ese objeto "gráficos" es usar el parámetro e que se pasa al evento OnPaint con el objeto PaintEventArgs.

Protegido reemplaza a Sub OnPaint (

 ByVal e As System.Windows.Forms.PaintEventArgs)

 Dim g As Graphics = e.Graphics

Otros ejemplos

¿Qué más puedes hacer con estos parámetros? Para ilustrar, suponga que desea encontrar si una cadena, tal vez algo que ingresó en un cuadro de texto, existe en cualquiera de una colección de otros cuadros de texto cuando hace clic en uno. Puede codificar algunas docenas de subrutinas prácticamente idénticas para cada cuadro de texto:

Si TextBox42.Text.IndexOf (

 SearchString.Text) = -1 

 Entonces NotFound.Text = 

 "Extraviado"

Pero es mucho más fácil codificar solo uno y dejar que se encargue de todos ellos. El parámetro del remitente revelará en qué cuadro de texto se hizo clic.

Sub FindIt privado (

 Remitente ByVal como System.Object,

 ByVal e As System.EventArgs

 ) Maneja TextBox1.Enter, 

 TextBox2.Enter, 

… y así sucesivamente… 

 TextBox42.Enter

 Dim myTextbox As TextBox

 myTextbox = remitente

 Dim IndexChar As Integer = 

 myTextbox.Text.IndexOf ( 

 SearchString.Text)

 Si IndexChar = -1 Entonces _

 NotFound.Text = "No encontrado" _

 El otro _

 NotFound.Text = "¡Lo encontré!"

 End Sub

Recientemente, un programador me pidió una mejor manera de "eliminar la línea en la que se hizo clic en cualquiera de las seis listas especificadas". Lo tenía trabajando en un par de docenas de líneas de código que simplemente me confundieron. Pero usando el remitente, fue realmente bastante simple:

Private Sub ListBox_Click ( 

 Remitente ByVal como objeto, 

 ByVal e As System.EventArgs

 ) Maneja ListBox1.Click, ListBox2.Click

 Dim myListBox como nuevo ListBox

 myListBox = remitente

 myListBox.Items.RemoveAt (myListBox.SelectedIndex)

End Sub

Un ejemplo más para precisar el punto es una pregunta enviada por Pierre en Bélgica. Pierre estaba probando la igualdad de Button1 y el remitente utilizando el Es operador para objetos:

Si el remitente es el botón 1, entonces ... 

Esto es sintácticamente correcto porque el remitente y Button1 son objetos a los que se puede hacer referencia. Y dado que el remitente es realmente idéntico a Button1, ¿por qué no funciona??

La respuesta depende de una palabra clave que se encuentra un poco antes en la declaración. Primero, revisemos la documentación de Microsoft para Es operador.

Visual Basic compara dos variables de referencia de objeto con el operador Is. Este operador determina si dos variables de referencia se refieren a la misma instancia de objeto.

Observe que se pasa el remitente ByVal. Eso significa que se pasa una copia de Button1, no el objeto real en sí. Entonces, cuando Pierre prueba para ver si el remitente y Button1 son la misma instancia, el resultado es False.

Para probar si se ha hecho clic en Button1 o Button2, debe convertir el remitente en un objeto Button real y luego probar una propiedad de ese objeto. Por lo general, se usa texto, pero puede probar un valor en Etiqueta o incluso en la propiedad Ubicación.

Este código funciona:

Dim myButton As Button

myButton = remitente

Si myButton.Text = "Button1" Entonces