domingo, 28 de marzo de 2010

ASP.NET – Orden de ejecucion de controles de usuario

filas Vamos a escribir sobre un tema que a menudo pone en encrucijada a los developers, y es el referido a cómo hacer para decidir el orden de ejecución de los controles ascx o de usuario?
Primero dejemos claro algo: Si tienes una página aspx que contiene varios controles de usuario (controlA.ascx, controlB.ascx, controlC.ascx), el orden de ejecución siempre va a iniciar con los eventos del padre, osea de la página aspx y no de los controles de usuario. Luego recién le seguirán los eventos del mismo nombre de los controles ascx. Lo explico de otra manera:
Si en el evento Load de una página aspx tengo código, y tengo código en el evento Load de los controles de usuario insertados en esa página, este será el orden de ejecución:
1.- Page_Load de la Página aspx
2.- Page_Load de los controles de usuario. Y como en nuestro caso, si tenemos varios controles de usuario en esa página, entonces el orden de ejecución será determinado según el orden en que son listados en la página, es decir… si tenemos esto:
<uc1:ControlA ID="ControlA1" runat="server" />
<uc2:ControlB ID="ControlB1" runat="server" />
<uc3:ControlC ID="ControlC1" runat="server" />


entonces primero se ejecutará el Load del ControlA, luego el Load del ControlB y luego el Load del ControlC.

Y si los controles también tienen código en otro evento, digamos preRender, será igual… primero se ejecutará el preRender de la página, luego el prerender del ControlA, luego el preRender del ControlB y luego el preRender del ControlC. No hay nada que podamos hacer hasta allí.

Si ben es cierto que hay situaciones que requieren que el orden de ejecución no sea el predeterminado, por ejemplo: a veces necesitamos que se ejecute un control de usuario antes que otro, para que así pueda cargar una variable que usará otro control de usuario.

Y Juanito levanta la mano y dice: professssssor, professssssor… yo sé que debe haber alguna forma de eludir esto y lograr que el orden de ejecución lo podamos decidir nosotros.

Tienes razón juanito, podemos hacer algunas jugadas con los eventos… para esto hay que conocer el orden de ejecución de los eventos. En resumen, éste es el orden de cargado tanto de paginas aspx como de controles de usuario: 1.- Page_Init, 2.- Page_Load, 3.- Page_PreRender, 4.- Page_Render

Ahora, lo que debemos hacer cuando queremos que el orden de ejecución no sea el predeterminado, osea digamos que queremos que el controlA.ascx cargue al final de todos los controles de usuario, a pesar de que se supone que cargará antes que todos… es simplemente coger un evento posterior (por ejemplo PreRender)y allí ponemos el código para el ControlA.ascx que se suponía debía ir en su Page_Load… y en los demás controles de usuario pongo el código en el Page_Load, lo cual determinará que primero cargue el ControlB.ascx, luego el ControlC.ascx y luego el ControlA.ascx. Esa es una forma y funciona y es una solución correcta, sólo hay que asegurarse que cogemos el evento adecuado.

Y Juanito nuevamente pregunta: Professssssssssor, professssssssssssor, soy corcho… y cómo se hace en el caso de que los controles de usuario se crean dinámicamente?

Es lo mismo juanito, el orden de los eventos es lo que manda… y no el orden en el que los creas dinámicamente… aunque parezca que así debiera ser…

a menos, a menos, a menos que el control de usuario tenga algún método o propiedad al cual estás llamando explícitamente, algo así:

Dim Test As wucTest = CType(LoadControl("~/controls/wucTest.ascx"), wucTest)
Test.Propiedad1 = "algun_dato"
Test.Metodo1()


En este caso sí que el método o propiedad se ejecutará/inicializará en el momento que lo llames…

Y dicho sea de paso, también es correcto inicializar variables para compartir con otros controles de esta manera (propiedades, métodos)… ya que se ejecutarán al instante que los llames, lo cual permitirá que los otros controles ya tengan inicializada cierta variable que les interese.

Espero que les sea de utilidad ;)

No hay comentarios.: