En muchas ocasiones uno se encuentra con este tipo de casos cuando desarrolla controles de usuario (UC) en asp.net, en general el caso se presenta de la siguiente manera:
- Tengo una pagina en aspx (digamos Default.aspx), el cual en su codebehind tiene un método (digamos metodoaspx)
- Tambien tengo un control de usuario (micontrol.ascx), el cual en su codebehind tiene un método (metodoascx)
Ahora, el meollo del asunto es que desde el método "metodoascx" del codebehind del UC quiero ejecutar el método "metodoaspx" que se encuentra en el codebehind de la pagina Default.aspx
Bueno entonces a resolverlo
Conceptos Previos
Delegados: Los delegados son un tipo que representa a una función con una determinada declaración.
mmmm ..... que?? ..... esteeeeeeee ... ya me confundí mas ;)
Para lo conocedores de C++ (osea los mas antiguos ... me apunto), este concepto es similar a los apuntadores a funciones.
Bueno para el resto de nosotros y en buen castellano quiere decir, que si yo declaro un tipo (si amigos míos lo que estamos haciendo es crear un tipo):
1: delegate int miTipoDelegado(int miargumento);
1: miTipoDelegado variableDelegado;
1: int unaFuncion(int variable){
2: //codigo
3: }
4:
5: int otraFuncion(int variable){
6: //codigo
7: }
yo podría acceder a cualquiera de ellas de la siguiente forma:
1: variableDelegado= new miTipoDelegado(unaFuncion);
1: variableDelegado= new miTipoDelegado(otraFuncion);
y podría ejecutarlas de la siguiente forma:
1: int resultado= variableDelegado(3);
y obtendríamos el resultado generado por cualquiera de las funciones elegidas.
el único requisito que se requiere es que el tipo de salida y los tipos de los argumentos del tipo delegate coincida con los de las funciones a utilizar.
uffffff, que lata con los delegates .....
Ahora si... La Solución!!!!!!!
Primero: dentro de la clase del UC micontrol.ascx debo declarar lo siguiente:
1: public delegate void LlamarMetodoEnPadre(); // este es el tipo
2: public LlamarMetodoEnPadre metodoaspx { get; set; } // esta es la variable que ni recibe ni devuelve valor alguno
Segundo: dentro del método Page_load de la pagina Default.aspx relacionamos la variable metodoaspx del tipo delegate LlamarMetodoEnPadre, con el método "metodoaspx" de la clase del codebehind de la pagina Default.aspx, de la siguiente manera
1: micontrol1.metodoaspx = metodoaspx;
(obviamente para usar micontrol1 debimos de haber arrastrado una instancia del UC micontrol.ascx hacia nuestro diseño de la pagina Default.aspx.... solo lo recuerdo por si acaso )
por Ultimo: dentro del método "metodoascx" del UC micontrol.ascx llamaremos al método "metodoaspx" de la pagina Default.aspx de la siguiente manera:
1: public void metodoascx(){
2: metodoaspx();
3: }
y Listo así podemos ejecutar cualquier función en la pagina Default.aspx desde un UC micontrol.ascx de nuestra aplicación.
Espero que el articulo les sirva para que entiendan un poco mas acerca de los delegados y resuelvan el dilema propuesto al inicio.
Saludos.