ASP.NET – Page.FindControl retornando null
Postado em 20/07/2009 17:07:47 por Tomás VásquezO método FindControl da classe Control retorna um controle da coleção Controls da própria classe pela propriedade ID. Comumente utilizamos este método para encontrar algum controle cujo ID é passado por parâmetro ou quando o controle é gerado dinamicamente. Mais comum ainda é usá-lo para obter um controle em uma linha do GridView, tipicamente no evento RowDataBound.
O caso é que algumas vezes, mesmo sabendo que o controle existe na página, ao realizar um Page.FindControl por um ID de um controle conhecido, o método retorna null. A razão é simples. A hierarquia de controles de uma página ASP.NET faz com que os controles não fiquem relacionados diretamento à coleção de controles da página.
A figura abaixo mostra a hieraquia de controles de uma página ASP.NET no modelo WebForms:
![ctrl.hier[1] Hierarquia de Controles de uma página ASP.NET/WebForms](http://www.tomasvasquez.com.br/blog/wp-content/uploads/2009/07/ctrl.hier1.gif)
Hierarquia de Controles de uma página ASP.NET/WebForms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private Control FindControlRecursive(Control root, string id) { if (root.ID == id) { return root; } foreach (Control c in root.Controls) { Control t = FindControlRecursive(c, id); if (t != null) { return t; } } return null; } |
A chamada da função fica bem simples:
1 | FindControleRecursive(this.Page, "IDdoMeuControle"); |
Isso resolve o problema de encontrar seu controle, mesmo tendo certeza de que ele está na página.
Nem tudo são flores
Apesar de esta parecer a solução de todos os problemas (e até é), o problema desta rotina é a performance. Apesar de não haver uma perda muito grande desta, se houver alguma outra forma de identificar o controle procurado mais diretamente e sua lógica permitir, prefira-a. Isso vai poupar um bom processamento.
Fonte: http://www.codinghorror.com/blog/archives/000307.html
Tomás

3 comentários para “ASP.NET – Page.FindControl retornando null”
Tomas,
Obrigado pela dica, show, estava tentando resolver esse problema a semanas.
Adriano
Mas se estou tentando acessar o controle do aspx através do ascx, não funciona.
Já tentei usar:
Page parentPage = (Page)HttpContext.Current.Handler;
Controle mdPex = (Controle)parentPage.FindControl(“IdControle”);
O que está errado?
Alcides,
A partir de agora responderei a perguntas no fórum:
http://www.tomasvasquez.com.br/forum
Nos vemos lá!
Tomas