domingo, 7 de novembro de 2010

Pra que serve o Page_PreRenderComplete afinal?

Bom,
Sabe aquele papo que todo problema serve para você aprender? Então, passei por um destes na semana passada que me fez pesquisar um pouco para conseguir resolver, e a solução foi um tanto curiosa por isso eu vou explicar cada ponto:

O Problema:
Tenho uma página onde utilizo um UpdateProgress, e dentro dele tenho um Label onde deverei informar o que esta acontecendo para o usuário, algo do tipo: "Buscando Empresa", "Vinculando Contatos", etc...
Alguém aí já tentou fazer um UpdateProgress.FindControl("ID_Controle")? você não pode fazer isto porque quando você acessa isto nos metodos que precedem ou até mesmo no próprio Page_Load(), o componente não foi renderizado e o que existe nele ainda é um Template.

Se você quer recaptular um pouco sobre os eventos disparados no post, dá uma olhada neste link do MSDN: Page Object Model

O Motivo:
Como eu disse antes, durante um page_load(), ou qualquer metodo de changed/click, o componente UpdateProgress ainda está com seu conteúdo na forma de um template. tornando a chamada de UpdateProgress.FindControl("ID_Controle") completamente ineficaz, pois sempre ela retornará null.


A Solução:
Após todas as alterações que são feitas no "HTML" pelos metodos de Page_Load, Changed ou Click, o framework ainda dispara alguns metodos que não estão por padrão assinados no seu arquivo de Code_Behind( .cs ou .vb). E o metodo que me salvou o dia é justamente um destes. Page_PreRenderComplete.

Este metodo é disparado logo após a renderização de todos os objetos estiver finalizada, porém ele ainda consegue referenciar cada objeto por seu Id (ainda pelo lado do servidor, não estou falando de ClientId).
Portanto se você precisar fazer algo neste sentido, utilize o Page_PreRenderComplete para fazer a chamada de FindControl no seu UpdateProgress.

C# Sintaxe:
protected void Page_PreRenderComplete
(object sender, EventArgs e)
{
//seu codigo aqui
}

VB Sintaxe:
Protected Sub Page_PreRenderComplete(ByVal sender As Object, 
ByVal e As System.EventArgs) Handles Me.PreRenderComplete 
'seu codigo aqui
End Sub


Se tiverem algum problema para resolver isto, por favor entrem em contato. Terei prazer em ajudar.

Nenhum comentário:

Postar um comentário