ASP.NET – Page.FindControl retornando null

Postado em 20/07/2009 17:07:47 por Tomás Vásquez

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:

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

  1. 3 comentários para “ASP.NET – Page.FindControl retornando null”

  2. Por Adriano Silva em 15/08/2009 20:08:17 | Responder

    Tomas,

    Obrigado pela dica, show, estava tentando resolver esse problema a semanas.

    Adriano

  3. 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?

  4. Alcides,

    A partir de agora responderei a perguntas no fórum:

    http://www.tomasvasquez.com.br/forum

    Nos vemos lá!

    Tomas

Você precisa ser um usuário registrado para inserir um comentário. Faça seu login clicando aqui