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.

7 comentarios:

  1. Muchas gracias por la explicación, me ha surgido alguna duda pero me ha sido de gran ayuda.

    Un saludo y gracias.

    ResponderEliminar
  2. oie compadre, cual asi como tenemos un Page_Load() en una pagina asp, habrá un método que sea el último que se ejecute al salir de la página?

    ResponderEliminar
  3. En realidad existe un metodo de tipo unload pero no creo que te sirva por que es exclusiva del servidor para procedimientos de limpieza y esas cosas, imagino que lo que quieres hacer es ejecutar algo cuando cierras una pagina o redireccionas hacia otra, si ese es el caso ten en cuenta que cuando cierras una pagina estas en tu navegador (cliente), no en el servidor por ende no puedes acceder a metodos de objetos en el servidor. La solucion si es cierre de pagina es poner un boton(button) con el titulo cerrar en el cual implementes el codigo que cerrara tu pagina en el evento click, o lo otro es que trates de controlar el cierre con javascript igual necesitaras un boton html dentro de la pagina. Si es redireccion usas un linkbutton y escribes el codigo necesario en su evento click redireccionas a la otra pagina

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  5. Impresionante, te pondría un monumento ahora mismo!!! Sencillo y efectivo, la de tiempo que me hubieras ahorrado de descubrirte un par de dias antes! ;)

    ResponderEliminar
  6. Oye, no te entiendo cuando dices eso de arrastrar una instancia....puedes darme un ejemplo, please.

    ResponderEliminar
  7. Asumiendo que ya tienes construido tu control de usuario y obviamente se encuentra en la lista de archivos de tu aplicacion, solamente tienes que arrastrar el control de la lista de archivos a la vista de diseño nada mas

    ResponderEliminar