Tag Archives: FindControl

ASP.NET – Page.FindControl retornando null

O 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:

Hierarquia de Controles de uma página ASP.NET/WebForms
Hierarquia de Controles de uma página ASP.NET/WebForms
Além dessa hierarquia, é preciso contar com o fato de que seu controle pode estar dentro de um outro do tipo “container”, como um PlaceHolder, Panel ou mesmo em um UserControl. Para resolver definitivamente o controle de encontrar um controle na sua página, é preciso fazer uma busca recursiva. Lembra do Fatorial? Pois é. A rotina abaixo faz uma busca recursiva dentro de um controle, passando o ID do controle procurado por parâmetro:

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