jueves, 31 de diciembre de 2009

ASP.NET - Eventos de Controles de Usuario (ASCX)

El código completo del ejemplo lo puedes encontrar aquí.

A la hora de crear controles de usuario solemos necesitar capturar un evento que se produce dentro del mismo, en la página padre. Además, normalmente, necesitaremos acceder a alguna de sus propiedades desde la página padre. En el ejemplo que os presento tenemos un control de usuario (un buscador) incrustado en una página que mostrará los resultados de la búsqueda.

Para ello el control de usuario posee un evento que se lanza una vez la búsqueda ha finalizado, además, los resultados de dicha búsqueda se almacenan en una propiedad del control de usuario que recupera la página para mostrarlos en un GridView.

Pasemos al código. El control de usuario, en su parte visual se compone únicamente de un TextBox (donde introducir el criterio de búsqueda) y un Button (que realiza la búsqueda).


 



 

La generación del evento se realiza desde el code-behind:


 

#region Eventos del control

public event
EventHandler AceptarClicked;

protected
virtual
void OnClick(object sender)

{

if (this.AceptarClicked != null)

{

this.AceptarClicked(sender, new EventArgs());

}

}

#endregion


 

Este código declara el evento (cuyo nombre será AceptarClicked) e implementa el método que invoca el evento.


 

#region Propiedades publicas

private
List<string> resultados;

public List<string> Resultados

{

get { return resultados; }

set { resultados = value; }

}

#endregion


 

El código anterior declara una propiedad pública dentro del control donde se almacenarán los resultados de la búsqueda.

En el evento del botón del control de usuario realizamos la llamada al evento público que será capturado por la página:


 

protected
void btnBuscar_Click(object sender, EventArgs e)

{

//Hardcode para simular una búsqueda

this.resultados = new
List<string>();

if (String.IsNullOrEmpty(this.txtPalabraClave.Text))

{

this.resultados.Add("No se han encontrado resultados");

}

else

{

this.resultados.Add("Resultado1 para " + this.txtPalabraClave.Text);

this.resultados.Add("Resultado2 para " + this.txtPalabraClave.Text);

this.resultados.Add("Resultado3 para " + this.txtPalabraClave.Text);

this.resultados.Add("Resultado4 para " + this.txtPalabraClave.Text);

}

//Se invoca el evento público una vez la función del control ha terminado

OnClick(sender);

}


 

La página debe capturar el evento, esto se hace de igual forma que se captura el evento de un botón o cualquier control de .NET. Así, en la presentación de la página tendremos:


 

<uc1:Buscador ID="Buscador1"
runat="server" OnAceptarClicked="Buscador1_AceptarClicked"/>


 

Así el método de tratar el evento del control de usuario, dentro de la página padre será Buscador1_AceptarClicked y se codificará así:


 

protected
void Buscador1_AceptarClicked(object sender, EventArgs e)

{

if (this.Buscador1.Resultados != null)

{

this.GridView1.DataSource = this.Buscador1.Resultados;

this.GridView1.DataBind();

}

}


 

El código completo del ejemplo lo puedes encontrar aquí.

Y esto es todo, espero que te sirva

8 comentarios:

  1. Muy útil! Muchas gracias!

    ResponderEliminar
  2. Bueno gracias, podrias ponerlo en BV

    ResponderEliminar
  3. Excelente aporte. Estaba buscando esta información.

    ResponderEliminar
  4. Excelente!!! me ayudo muchisimo!!!
    Gracias.
    Juan Manuel Romero. Cordoba, Argentina.

    ResponderEliminar
  5. Muy buen ejemplo secillo, practico y puntual

    ResponderEliminar
  6. Que buen tutorial, gracias por compartir tu conocimiento.

    ResponderEliminar
  7. ¿hay necesidad de crear la propiedad?

    ResponderEliminar