FindControl no Repeater com C# e ASP.NET
16/10/2009 in Geek Talk
Hoje fui consultado sobre o método FindControl no Repeater do ASP.NET. Comecei então a pensar no tempo que iniciei o aprendizado em ASP.NET, e tive alguns problemas com o Repeater.
Esse controle é relativamente fácil de se entender, mas na minha opinião, o problema é que ele favorece a “gambiarra“. Ele permite que você insira muita lógica de programação, dentro do arquivo ASPX. Não querendo entrar no mérito de desenvolvimento em camadas, mas se a Microsoft propôs a divisão em um arquivo ASPX e outro do codebehind, é porque ela tinha em mente separar a apresentação do código. Analisando isso, desde cedo me eduquei a trabalhar com repeater no codebehind e não no ASPX. E uma pergunta que me é feita frequentemente por quem está se acostumando com o desenvolvimento em .NET é: “Como posso manipular um controle que está dentro do repeater no codebehind?”
O caminho natural é programar dentro do evento ItemDataBound do repeater, algo como:
meuRepeater.FindControl(“nomeDoControle”);
Infelizmente, isso não vai te trazer o resultado esperado, pois o seu controle está dentro do ItemTemplate do repeater. O ItemTemplate vai virar um Array de Itens, criando um novo item para cada linha do datasource que você usou para preencher o repeater. Então o correto é tentar achar o controle no Item do repeater e não no repeater diretamente. A sintaxe ficaria algo como:
void meuRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Label lblDescricao = (Label) e.Item.FindControl(“lblDescricao”);
lblDescricao.Text = “Meu novo Texto”;
}}
No Exemplo acima, utilizamos o RepeaterItemEventArgs que é passado como parametro ao Evento para obter acesso ao Item corrente e procurar nosso Label dentro dele.
E você, tem alguma duvida sobre .NET? Esse artigo não esclareceu sua duvida? Deixe seu comentário ou envie um e-mail que terei prazer em responder.
