Controlando Eventos y Arrays
Uso de Controladores de Eventos en una Aplicación .Net
Arrays de dos dimensiones
Creación de DataSet por Código 

Fecha: 31/May/2005 (30 de Mayo de 2005)
Autor: Ing. Fernando Luque Sánchez   - 
Trujillo - Perú 
                        [email protected]  -   
                        [email protected]
                        [email protected]

 


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:

  1. 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.

Notas importantes:

ELIMINAR LOS CONTROLADORES

Para eliminar la asignación de un controlador de evento se utiliza RemoveHandler que tiene la siguiente sintaxis:

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

En nuestro ejemplo se pide cinco datos y luego se almacenan estos en un arrays de dos dimensiones, luego esos datos del array se guardan en un DataTable de un DataSet creado por código. Espero les sirva.

Aqui parte del Código:

'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

El código completo está en el archivo adjunto. Suerte a todos, espero les sirva de ayuda, no olviden dar su opinión en mi Panoramabox, gracias.

Ing. Fernando Luque Sánchez
DCE 4 Estrellas


Espacios de nombres usados en el código de este artículo:

System.Data


Fichero con el código de ejemplo: FernandoLuque_Controlando_Eventos_y_Arreglos.zip - 17 KB


ir al índice