Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Veamos un ejemplo prctico y sencillo del uso de eventos delegados, de forma que nos quede claro su concepto y su uso.
Que es un Delegado?
Un delegado (delegate) es un tipo especial de clase cuyos objetos pueden almacenar referencias (punteros, apuntadores) a uno o ms mtodos, posibilitndonos (desde el objeto) lanzar la ejecucin en cadena de todos estosmtodos. Hasta aqu la definicin mas sencilla posible, pero igualmente algo complicada de entender, expliqumosla a travs de 2 ejemplos abstractos con la esperanza de que se comprenda algo mejor:
Nota: Hasta aqu hemos visto como asociar un mtodo (MetodoPruebaDelegado) al evento (Click) de un control(btnPrueba1), no hemos hablado nada de los DELEGADOS; pero en C# eventos y delegados estn muy ligados como veremos a continuacin. De hecho no se puede definir un evento si no definimos previamente un delegado.
Para ello crearemos una pgina que contendr, entre otras cosas, 2 controles y un mtodo: ucBuscadorCriterios (marcada en rojo): Contiene las condiciones de filtros a establecer para la bsqueda del vuelo. ucBuscadorResultado (marcada en azul): Contendr los resultados de los vuelos que cumplen las condiciones establecidas. BuscarVuelos(): Mtodo que se encargar de buscar y devolver todos los vuelos que cumplen con unas ciertos criterios de bsqueda. Los criterios son definidos en ucBuscadorCriterios y los resultados los usaremos para mostrarlos en ucBuscadorResultado. Hasta aqu todo bien, pero si nos fijamos en ucBuscadorCriterios (rojo) dentro tiene el botn btnBuscarVuelos, el cual debe lanzar la bsqueda, o sea, debe llamar al mtodo BuscarVuelos() que est en la pgina. Nuestro problema sera: Como llamar a Page1.BuscarVuelos() desde Page1.ucBuscadorCriterios? La respuesta es sencilla, usaremos un delegado (delegate).
public partial class UserControlsAereoBuscadorCriterios : UserControl { //Declarar el delegado //(puntero a la funcin que se encuentra en la pagina) public delegate void MyDelegadoBuscarEventHandler(); public event MyDelegadoBuscarEventHandler AereoBuscadorBuscarClick; protected void Page_Load(object sender, EventArgs e) {} //Evento asociado al botn AereoBuscadorBuscar y que es un delegado o puntero a la funcin que se encuentra en la pagina protected void AereoBuscadorBuscar_Click(object sender, EventArgs e) { if (AereoBuscadorBuscarClick == null) return;
AereoBuscadorBuscarClick();
} } Para asociar el evento que hemos creado (AereoBuscadorBuscarClick) al mtodo de la pgina (Page1.BuscarVuelos()) tenemos que ir al cdigo de la pgina y en el evento Page_load hacer la asociacin correspondiente: protected void Page_Load(object sender, EventArgs e) { //Asociar el delegado del control de usuario ucBuscadorCriterios.AereoBuscadorBuscarClick += BuscarVuelos; } internal void BuscarVuelos() {} Y todo listo, ya tenemos un ejemplo prctico de un delegado (delegate) Despus de escribir el artculo no se si ha quedado clara la idea de uso de un delegado. Por eso resumir algunos puntos por si queda alguna duda: Resumen: Siempre que queramos hacer uso de los eventos y delegados en C# deberemos: 1. Declarar el delegado. Para el mejor entendimiento debemos tener en cuenta que el delegado no es otra cosa que una clase (tipo de dato) especial. 2. Declarar el evento de tipo del delegado. Si tenemos en cuenta que el delegado es una clase, pues el eventoes algo como una propiedad especial del tipo delegado. 3. Implementar el mtodo X a suscribir. Este mtodo deber tener la misma firma que el delegado. 4. Por ultimo, para asociar o enlazar un mtodo X al evento, accedemos a la propiedad del objeto y le adicionamos el mtodo. Teniendo en cuenta que el mtodo X tiene que cumplir con la firma del delegado.