miércoles, 11 de julio de 2012

Lanzar eventos desde un control de usuario ASP.NET

Enunciado

Una forma muy cómoda de comunicar un control de usuario (.ascx) con la página u otro control de usuario que le contiene es definir un evento, lanzarlo y recogerlo.

Por ejemplo:
Un control de usuario realiza un búsqueda y la visualiza en un dataGrid.
Cuando el usuario elige un comando en una fila del datagrid el control de usuario lanza un evento informando con un texto y un identificador.

Solución:

Un pequeño truco, en el data grid usamos un comando con nombre y argumento.

   
        
           
         
         
   

En el código del control de usuario definiremos el evento y lo lanzaremos en dos casos:
  1. Con el evento RowCommand del datagrid
  2. Al hacer en click en cancelar (un botón)

Public Event eleccion As System.EventHandler

Private Sub gvActiv_RowCommand(
                        sender As Object, 
                        e As GridViewCommandEventArgs
                        ) Handles gvActiv.RowCommand
        RaiseEvent eleccion(Me, New ArgumentoObjetoElegido(e))
End Sub

Protected Sub LBCancelar_Click(
                        sender As Object,
                        e As EventArgs) Handles LBCancelar.Click
        RaiseEvent eleccion(Me, New ArgumentoObjetoElegido)
End Sub
Observar que como segundo argumento al lanzar el evento (RaiseEvent) hemos usado la clase ArgumentoObjetoElegido que hereda de EventArgs.
Esta clase puede crearse con y sin los argumentos. En caso de usar argumentos estos son del tipo GridViewCommandEventArgs.
Public Class ArgumentoObjetoElegido
    Inherits EventArgs
    Public Property Identificador As Integer = 0
    Public Property Descripcion As String = "(Nada seleccionado)"

    Public Sub New(Argumentosfila As GridViewCommandEventArgs)
        Identificador = CInt(Argumentosfila.CommandArgument)
        Descripcion = Argumentosfila.CommandName
    End Sub
    Public Sub New()
        'sin argumentos, valores iniciales arriba
    End Sub
End Class
Finalmente hay que recoger el evento en la página principal:
Private Sub EligeActiv_eleccion(sender As Object, e As ArgumentoObjetoElegido) Handles EligeActiv.eleccion
        If e.Identificador = 0 Then
            'Codigo para procesar cancelación
            If controlador.ActividadEnCurso.identificador = 0 Then
                controlador.ControlMenos()
            Else
                EstableceVista(VistaActividad)
            End If
        Else
            'codigo para procesar una elección el grid
            controlador.ActividadEnCurso.identificador = e.Identificador
            controlador.ActividadEnCurso.Descripcion = e.Descripcion
            EstableceVista(VistaActividad)
        End If
    End Sub

No hay comentarios: