Controlando Eventos y
Arrays Fecha: 31/May/2005 (30 de Mayo de 2005)
|
Sres. Desarrolladores, en esta ocasión les envío un aporte interesante para comprender el uso de Delegados en aplicaciones de Visual Studio .Net
Un poco de Teoría
Al desarrollar aplicaciones en Visual Studio 6.0, muchos de nosotros implementábamos los arrays de controles para agrupar varios controles en procedimientos donde después evaluábamos el índice para decidir o saber que botón fue pulsado. Al desarrollar aplicaciones en Visual Studio .Net cambiamos esa forma de trabajo con el uso de Controladores de Eventos (Handles).
Cuando nosotros usamos una aplicación al pulsar click en un botón de comando se produce el evento click del control respectivo, suponiendo que el nombre de ese botón es cmdGuardar y el evento es Click al escribir el código para esto, Visual Basic le asigna una nomenclatura estándar y le asigna automáticamente el nombre cmdGuardar_Click. y aparece como sigue:
Private Sub cmdGuardar_Click(Byval..... ) Handles cmdGuardar.Click
End Sub
Nos podemos dar cuenta de lo siguiente, Visual Studio le asigna al procedimiento Sub el nombre cmdGuardar_Click, este nombre en aplicaciones de escritorio lo podemos cambiar sin ningún problema, en aplicaciones ASP debemos cambiar el valor de la Propiedad AutoEventWireUp a False para poder hacerlo. Lo mas importante de los controladores se define después de la palabra Handles. Después de esto podemos definir los controles y eventos que han sido asignados al evento.
ASIGNAR LOS CONTROLADORES
La asignación de los controladores se puede realizar de dos formas:
- Asignando el controlador en la definición del Procedimiento, separados por comas después de la palabra Handles, como sigue:
Private Sub Procesar(Byval..... ) Handles cmdGuardar.Click, cmdCambiar.Click,cmdEliminar.Click
End Sub
Lo que significa que el peocedimiento Procesar se ejecuta cuando se pulsa click en los controles cmdGuardar, cmdCambiar y cmdEliminar.
Para controlar que control fue pulsado utilizamos la variable sender de la siguiente manera:
Private Sub Procesar(Byval..... ) Handles cmdGuardar.Click, cmdCambiar.Click,cmdEliminar.Click
If sender Is cmdGuardar Then
'Líneas de código para guardar
ElseIf sender Is cmdCambiar Then
'Ejecuta el Procedimiento Cambiar
ElseIf sender Is cmdEliminar Then
'Ejecuta el Procedimiento para eliminar
End If
End Sub
2. Asignar el controlador utilizando la instrucción AddHandler, cuya sintaxis es como sigue:
AddHandler <Control.Evento>, AddressOf <Nombre Procedimiento>
La asignación de estos controladores puede ser en el evento Load del Formulario o en el contructor (evento New). Para el ejemplo que estamos siguiendo los controladores se asignan con las siguiente líneas:
AddHandler cmdGuardar.Click, AddressOf Procesar
AddHandler cmdCambiar.Click, AddressOf Procesar
AddHandler cmdEliminar.Click, AddressOf Procesar
Personalmente recomiendo crearlos en el constructor. Tenga en cuenta que asignarlo en los dos Procedimientos no reporta errores al ejecutar, pero si en el proceso.
RemoveHandler <Control.Evento>, AddressOf <Nombre Procedimiento>
Si se quisiera eliminar el controlador para los controles anteriores las ordenes serían:
RemoveHandler cmdGuardar.Click, AddressOf Procesar
RemoveHandler cmdCambiar.Click, AddressOf Procesar
RemoveHandler cmdEliminar.Click, AddressOf Procesar
VAMOS CON NUESTRO EJEMPLO
'Procedimiento
que procesa los 4 botones de comando del formulario
'El delegado se ha especificado en el constructor
'NOTE QUE EXISTE ASINGADO DOS VECES EL CONTROLADOR AL
BOTON CERRAR
'Y NO REPORTA NINGUN ERROR...TENGA MUCHO CUIDADO CON ESTO
Private
Sub Procesar(ByVal sender As
System.Object, _
ByVal e As System.EventArgs) Handles cmdGuardar.Click, cmdCerrar.Click
'NOTA
IMPORTANTE:
' Se utiliza la variable
sender para saber que control
' se ha utilizado.
If sender Is cmdGuardar Then
'Permite guardar el elemento actual en el
Array
GuardarElemento()
ElseIf sender Is cmdBorrar Then
'Ejecuta el
Procedimiento BorrarTodo
BorrarTodo()
ElseIf
sender Is cmdMostrar Then
MostrarTodos()
ElseIf sender Is cmdCerrar Then
End
End If
End Sub
Private Sub
GuardarElemento()
'Comprobar
el ingreso de datos
If Len(Trim(txtNombre.Text)) = 0 Or Len(Trim(txtDire.Text)) = 0 Then
MessageBox.Show("Datos
imcompletos...", "Error")
Exit Sub
End If
If cboGrado.SelectedIndex =
-1 Then
MessageBox.Show("Seleccione en grado de instrucción...", "Error")
Exit Sub
End If
'Hacer crecer el array y Guardar los datos
actuales.
ReDim
Preserve aRegistros(4, cRegistros)
aRegistros(0, cRegistros) = Trim(txtNombre.Text)
aRegistros(1, cRegistros) = Trim(txtDire.Text)
aRegistros(2, cRegistros) = IIf(optEstable.Checked, "Estable",
IIf(optContrato.Checked, "Contratado", "Service"))
aRegistros(3, cRegistros) = IIf(optEstable.Checked, "Soltero",
"Casado")
aRegistros(4, cRegistros) = Trim(cboGrado.SelectedItem)
cRegistros += 1
End Sub
Private Sub
BorrarTodo()
ReDim aRegistros(4, 0)
cRegistros = 0
dgRegistrados.DataSource = Nothing
'Borrar los datos actuales
txtNombre.Clear()
txtDire.Clear()
optEstable.Checked = True
optSoltero.Checked = True
cboGrado.SelectedItem = -1
cboGrado.Text =
"Seleccionar"
txtNombre.Focus()
End Sub
Ing. Fernando Luque
Sánchez
DCE 4
Estrellas
System.Data
Fichero con el código de ejemplo: FernandoLuque_Controlando_Eventos_y_Arreglos.zip - 17 KB