none
CheckBox volta sempre nulo com o FindControl RRS feed

  • Pergunta

  • Bom dia, Pessoal.

    Beleza?

    Estou com um problema muito chato HAHA, já tentei de tudo.

    Seguinte, eu tenho um Grid e adicionei um TemplateField nesse grid com um CheckBox.

     <asp:TemplateField>
                    <HeaderTemplate>
                        OK_MF
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:CheckBox ID="cbOKMF" runat="server" CommandArgument='<%# Eval("Ok_MF")%>' OnCheckedChanged="cbOKMF_CheckedChanged" />
                                        </ItemTemplate>
                </asp:TemplateField>

    E preciso pegar esse CheckBox, através do código, utilizando o FindControl.

    CheckBox cbOKMF = (CheckBox)e.Row.FindControl("cbOKMF");

    O problema é que ele SEMPRE ME RETORNA NULO =///

    Já até tentei colocar um ImageButton, mudei os controles, coloquei um Input também e nada, tudo me retorna nulo.

    Estou perdido, realmente não sei mais o que fazer.

    Alguém pode me ajudar, por favor?

    Agradeço desde já.

    Att.

    terça-feira, 29 de maio de 2012 12:24

Respostas

Todas as Respostas

  • Seu problema pode estar relacionado com o ID do seu controle! 

    Verifique se o ID gerado pela aplicação é realmente este.

    terça-feira, 29 de maio de 2012 12:29
  • Olá, Murillo.

    Sim, o ID do CB é esse sim, estou passando o mesmo =/

    terça-feira, 29 de maio de 2012 12:55
  • Se você quis dizer para eu conferir o ID do controle quando a página é renderizada, eu já fiz isso.

    O nome até fica diferente, coloquei, e mesmo assim ele me retorna nulo. =/

    Não sei o que fazer HAHA

    terça-feira, 29 de maio de 2012 13:00
  • Pessoal, acho que eu sei o que pode ser.

    O método do DataBound está acontecendo antes do meu Grid carregar, ou seja, ele não encontra mesmo nenhum CheckBox.

    Eu só chamo o meu método de CarregarGrid quando o usuário clica no botão PESQUISAR, que ai sim o meu grid é carregado.

    Mas o DataBound executa antes, como posso mudar isso?

    terça-feira, 29 de maio de 2012 14:02
  • Quando vc necessita buscar de usar o método que busca pelo check box? Não sei se eu entendi direito.

    parece óbvio, mas tenta chamar só depois que o Grid tiver carregado...

    terça-feira, 29 de maio de 2012 15:54
  • Vou explicar melhor tudo que eu preciso fazer.

    Seguinte, tenho na minha página um Grid, com alguns campos de busca e um botão pesquisar.

    Ao entrar na minha página, eu coloquei propositavelmente para o Grid não carregar, só carregar depois do usuário preencher algum campo de pesquisa e clicar no botão Pesquisar. O problema está ai, quando preencho algum campo e pressiono o botão pesquisar, o meu projeto entra primeiro no DataBound e depois cai no CarregarGrid. Debugando, eu pulei a primeira vez que ele passa pelo DataBound e na segunda já funciona, faz tudo direitinho.

    O problema é na 1º vez mesmo.

    No meu load está assim:

    

     protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                CarregaComboTipo();            
            }        
        }  


    Ai eu chamo meu CarregarGrid no click do botão:

    public void PesquisarEquipamentos(object e, EventArgs sender)
        {
            CarregaGrid();
        }

    Ai o meu databound é chamado antes do carregar grid:

     protected void grdPesquisa_RowDataBound(object sender, GridViewRowEventArgs e)
        {              
            CheckBox cbOKMF = (CheckBox)e.Row.FindControl("cbOKMF");
            string valorMF = DataBinder.Eval(e.Row.DataItem, "Ok_MF").ToString();
            if (valorMF == "S")
            {
                cbOKMF.Checked = true;
            }
            else
            {
                cbOKMF.Checked = false;
            }      
        }

    terça-feira, 29 de maio de 2012 16:05
  • Tenta mandar chamar o "CarregarGrid()" no Pageload, toda vez que for um postback... 
    terça-feira, 29 de maio de 2012 16:18
  • Cara, eu fiz isso e não funcionou =/

    Voltou nulo mesmo assim na 1º vez.

    Percebi uma coisa agora, coloquei BreakPoint no Click do botão (que chama o CarregarGrid) e coloquei outro no DataBound.

    Cai primeiro no click do botão, ou seja, o Grid carrega antes do DataBound, mas mesmo assim no DataBound, o checkbox retorna nulo.

    PQP.

    terça-feira, 29 de maio de 2012 16:23
    • Marcado como Resposta Progamador.C terça-feira, 29 de maio de 2012 17:09
    terça-feira, 29 de maio de 2012 16:36
  • Nossa, Murillo.

    Me salvou cara, pqp.

    Consegui, ficou perfeito.

    Segue meu código:

    public void PesquisarEquipamentos(object e, EventArgs sender)
        {
            CarregaGrid();
            for (int i = 0; i <= grdPesquisa.Rows.Count - 1; i++)
            {
                GridViewRow dgItem = grdPesquisa.Rows[i];
                CheckBox cb = (CheckBox)dgItem.FindControl("cbOKMF");
                Label lblStatus = (Label)dgItem.FindControl("lblStatus");
                if (lblStatus.Text == "S")
                {
                    cb.Checked = true;
                }
                else
                {
                    cb.Checked = false;
                }
            }
        }

    Valeu mesmo, cara.

    • Marcado como Resposta Progamador.C terça-feira, 29 de maio de 2012 17:09
    terça-feira, 29 de maio de 2012 17:02
  • Boas implementações!
    terça-feira, 29 de maio de 2012 17:27