martes, 17 de marzo de 2009

Llamar metodo en pagina aspx desde un control de usuario con C#

El Problema

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); 
que representa una función que devuelve un numero entero y que tiene por argumento también un numero entero, yo podría declarar variables del tipo "miTipoDelegado" de esta forma
   1: miTipoDelegado variableDelegado; 
y si yo tuviese dos funciones de esta forma:

   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); 
o también
   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.