cenário:
aspx que faz o render de todas as outras páginas, aliás System.Web.UI.UserControl
main.aspx
– userControl.ascx
— componenteExistente.ascx
em vez da sequência PreInit, Init, InitComplete, PreLoad, Load, LoadComplete, SaveStateComplete, PreRender, PreRenderComplete de uma aspx tradicional temos uma sequencia bem mais curta de Init, Load e PreRender.
Para além de perceber a sequência dos eventos precisava de saber também como é que os userControls interagiam entre si. Basicamente a sequencia de eventos entre userControls funciona é:
- de baixo para cima – os userControls que estiverem definidos no topo da página são processados primeiro
- antes do load de fora para dentro – no caso de haver “nested” controls são processados primeiro os userControls que estiverem no nivel hierarquico mais baixo
- a partir do load de dentro para fora
- em sequência de eventos – os eventos de um mesmo tipo são todos processados em sequencia, ou seja primeiro processam-se todos os Inits, depois todos os Loads e assim sucessivamente.
- o processamento dos eventos dos controlos de uma página, por exemplo Button.Click são feitos depois do Load
Alguns pormenores a ter em conta:
- todos os objectos (System.Web.UI.Control) que forem criados dinamicamente têm que ser recriados a cada postback, preferencialmente no evento Init
- as propriedades de um objecto são populadas automaticamente na passagem do Init para o Load do userControl respectivo. um pormenor a ter em atenção é que isto aplica-se quer a objectos já existentes na página quer aos criados dinamicamente desde que mantenham o mesmo nome.
- o viewstate só fica disponivel no load
curiosamente, e ao contrário do que eu pensava, nada disto tem a ver com o viewstate o que se pode comprovar fazendo um trace há execução da página e verificando o estado dobjecto viewstate. Para mais informação ver o artigo: ViewState: All You Wanted to Know
Outro pormenor interessante é a utilização de variáveis estáticas (static / shared) que basicamente persistem o seu valor entre postbacks e estão logo disponiveis no primeiro evento – Init.
Deixe um comentário