El modelo de eventos en Visual Basic permite reaccionar a las acciones del usuario a través de controladores de eventos que se vinculan a los controles. Esto es crítico para programas con GUI (interfaz gráfica de usuario), donde cada elemento puede disparar sus propios eventos.
En el clásico VB6, el manejo de eventos se implementaba mediante un enlace estático control - método. En VB.NET y WinForms, el modelo se volvió más flexible: ahora se pueden vincular varios controladores a un mismo evento y se admite el enlace dinámico a través de AddHandler/RemoveHandler.
La dificultad típica es la adición dinámica de controles y el manejo de sus eventos. Si no se desuscriben los eventos o se vincula incorrectamente un controlador, pueden surgir fugas de memoria, duplicación de llamadas y pérdida de control sobre el comportamiento de la UI.
Al crear controles dinámicamente, utiliza AddHandler para suscribirte y RemoveHandler para eliminar correctamente el controlador. Presta atención al ciclo de vida de los controles: si un control se destruye, es necesario desuscribir los controladores, de lo contrario, quedarán referencias "colgadas".
Ejemplo de código:
Dim btn As New Button() AddHandler btn.Click, AddressOf ButtonClickHandler ' ... RemoveHandler btn.Click, AddressOf ButtonClickHandler Sub ButtonClickHandler(sender As Object, e As EventArgs) MessageBox.Show("¡Botón presionado!") End Sub
Características clave:
¿Qué pasará si el controlador de eventos se conecta varias veces al mismo elemento?
El controlador se llamará tantas veces como se haya agregado a través de AddHandler, lo que puede llevar a una ejecución inesperada de la lógica varias veces.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' Al presionar el botón, Handler será llamado 2 veces
¿Se puede usar un método con parámetros que difieren de la firma del evento?
No, la firma del método del controlador debe coincidir estrictamente con el delegado del evento (por ejemplo, Sub Handler(sender As Object, e As EventArgs)). El compilador mostrará un error en caso contrario.
¿RemoveHandler elimina todas las ocurrencias del controlador si se ha agregado varias veces?
No, RemoveHandler elimina solo una suscripción por llamada. Si el controlador se ha agregado varias veces, es necesario eliminarlo tantas veces como se haya agregado, de lo contrario, una instancia permanecerá vinculada.
RemoveHandler al destruir controles, lo que causa fugas de memoriaSe crean dinámicamente 100 botones en un bucle, y se asigna un controlador a todos, pero no se llama a RemoveHandler. Después de cerrar el formulario, el evento sigue "vivo", lo que provoca fallos frecuentes.
Pros:
Contras:
A cada control dinámico en la colección se le añade un controlador con nombre, y al eliminar el control se desuscriben explícitamente todos los controladores en un bucle.
Pros:
Contras: