Gridview com checkbox

112 views
Skip to first unread message

Celso Rivera

unread,
Oct 21, 2011, 1:56:36 PM10/21/11
to dotn...@googlegroups.com
Boa tarde a todos.

Caros, estou com um problema que inicialmente pareceu ser simples, mas
se tornou uma manada de elefantes brancos. Tenho uma tela de
Administração de usuários onde listo em um grid view todos os
usuários. O datasouce desse grid view é uma lista da classe Usuario.
Nessa classe usuário tenho um campo Administrador do tipo int, que
pode ser 0 ou 1, indicando true ou false. No banco de dados, SQL
Server, esse campo é bit. Nesse grid view tem um campo checkbox onde
gostaria que o checked estivesse true quando o camp Administrador for
1 e false quando o mesmo campo for 0. Criei um evendo rowdatabound e
tentei os seguintes códigos, mas nenhum funcionou:

CheckBox chk =
(CheckBox)grdUsuarios.FindControl("chkAdministrador");
chk.Checked =
Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Administrador")) ==
1;


CheckBox chk =
(CheckBox)grdUsuarios.FindControl("chkAdministrador");
if (Convert.ToInt32(DataBinder.Eval(e.Row.DataItem,
"Administrador")) == 1)
{
chk.Checked = true;
}
else
{
chk.Checked = false;
}

O erro é "Referência de objeto não definida para uma instância de um
objeto.". Pelo que entendo, não posso acessar o checkbox dessa
maneira. Caso seja isso, como fazer? Caso não seja isso, o que está
errado? Existe alguma forma mais simples de fazer isso? Já tentei com
checkboxfield e ele diz que não pode converter do tipo bool para
string.

Muito obrigado.

Abraços
--
Celso Rivera
rivera...@gmail.com

Bruno Gross

unread,
Oct 21, 2011, 2:07:32 PM10/21/11
to dotn...@googlegroups.com
Converte a coluna num template field

taca um checkbox la dentro com

 Checked="<%# DataBinder.Eval(Container.DataItem, "Campo")==1?"true":"false" %>"




Checked="<%# Bind("Campo")==1? "true" : "false" %>"

2011/10/21 Celso Rivera <rivera...@gmail.com>

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================



--
Visite:
DotNet Br
Compras no Exterior

att.
Bruno Gross
(21) 83422729

Bruno Gross

unread,
Oct 21, 2011, 2:07:46 PM10/21/11
to dotn...@googlegroups.com
os dois exemplos funcionam

2011/10/21 Bruno Gross <bruno...@gmail.com>

Rogério Bragil

unread,
Oct 21, 2011, 2:08:27 PM10/21/11
to dotn...@googlegroups.com
Boa tarde!

Tenta e.Row.Cells[NUMERO_DA_COLUNA].FindControl("chkAdministrador") ao invés de grdUsuarios.FindControl("chkAdministrador").

O parâmetro "e" passado para o tratador do evento RowDataBound traz exatamente a referência para a linha onde executar o evento (e.Row).

Espero ter ajudado!


Rogério Bragil

"Sola Scriptura, Solus Christus, Sola Gratia, Sola Fide, Soli Deo Gloria"

Rogério Fernando Bragil
Blog: http://www.bragil.net
Github: http://github.com/bragil
Twitter: @bragil
Jundiaí-SP


2011/10/21 Celso Rivera <rivera...@gmail.com>

Bruno Gross

unread,
Oct 21, 2011, 2:12:06 PM10/21/11
to dotn...@googlegroups.com
ah cara

no itemdatabound tem que usar

e.Item.FindControl

2011/10/21 Rogério Bragil <bra...@gmail.com>

Saulo Brito

unread,
Oct 21, 2011, 2:13:32 PM10/21/11
to dotn...@googlegroups.com
    protected void exemplo_DataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {           
            CheckBox chkResponsavel = (CheckBox)e.Row.FindControl("chkResponsavel"); << passa o "e" para que ele trate a linha atual

Celso Rivera

unread,
Oct 21, 2011, 2:44:54 PM10/21/11
to dotn...@googlegroups.com
Bom, vamos lá.

Bruno, fiquei em dúvida se colocava o seu exemplo no rowdatabound ou
na página aspx, coloquei na página aspx e deu o seguinte erro:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Parser Error
Description: An error occurred during the parsing of a resource
required to service this request. Please review the following specific
parse error details and modify your source file appropriately.

Parser Error Message: The server tag is not well formed.

Source Error:


Line 31: <asp:TemplateField HeaderText="Administrador">
Line 32: <ItemTemplate>
Line 33: <asp:CheckBox
ID="chkAdministrador" runat="server" Checked="<%#
DataBinder.Eval(Container.DataItem, "Administrador")==1?"true":"false"
%>"/>
Line 34: </ItemTemplate>
Line 35: <ItemStyle HorizontalAlign="Center" />


Source File: /View/UsuariosAdministracao.aspx Line: 33


--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:4.0.30319;
ASP.NET Version:4.0.30319.237

Rogério e Saulo, coloquei o seguinte código no rowdatabaund:

CheckBox chk =
(CheckBox)e.Row.Cells[1].FindControl("chkAdministrador");
chk.Checked = true;

coloquei um break point na primeira linha e o chk está como null após
a execução. Não devia conter um objeto? Já re-chequei o nome do campo
"chkAdministrador" e está correto. O campo é o segundo do grid, em um
array base 0 seria o campo 1, correto?

Muito obrigado

Saulo Brito

unread,
Oct 21, 2011, 2:48:52 PM10/21/11
to dotn...@googlegroups.com
checked= ' ' e não " "

Bruno Gross

unread,
Oct 21, 2011, 2:50:34 PM10/21/11
to dotn...@googlegroups.com
celso

Checked="<%#
DataBinder.Eval(Container.DataItem, "Administrador")==1 %>"/>

tenta assim

2011/10/21 Celso Rivera <rivera...@gmail.com>
--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================



--

Bruno Gross

unread,
Oct 21, 2011, 2:51:01 PM10/21/11
to dotn...@googlegroups.com
issae

2011/10/21 Saulo Brito <saulo....@gmail.com>

Saulo Brito

unread,
Oct 21, 2011, 2:54:52 PM10/21/11
to dotn...@googlegroups.com
- CheckBox chk = (CheckBox)e.Row.Cells[1].FindControl("chkAdministrador");
  chk.Checked = true;

Com isso vc sempre deixará marcado a segunda linha do grid .. abc

Celso Rivera

unread,
Oct 21, 2011, 3:00:32 PM10/21/11
to dotn...@googlegroups.com
Tá, troquei " por ' e deu o seguinte erro: "CS0019: Não é possível
aplicar o operador '==' a operandos do tipo 'object' e 'int'".

Acho que o problema agora está no acesso ao campo Administrador. Esse
campo faz parte da classe usuário, que está dentro de uma lista, ou
seja, o datasource do gridview é uma lista de tipo Usuario. Pelo que
entendi ele não está deixando acessar o campo diretamente, então como
fazer?

Muito obrigado.

Bruno Gross

unread,
Oct 21, 2011, 3:03:12 PM10/21/11
to dotn...@googlegroups.com
convert.toint32

2011/10/21 Celso Rivera <rivera...@gmail.com>
--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================

Celso Rivera

unread,
Oct 21, 2011, 3:07:44 PM10/21/11
to dotn...@googlegroups.com
Pessoal, funcionou com essa linha:

Checked='<%#DataBinder.Eval(Container.DataItem, "Administrador")=="0" %>'

Foi só colocar o "0" e passou a funcionar. Não entedi por que, já que
o campo administrador é int, mas enfim, funcionou. Muito obrigado a
todos.

Paulo César de França Viana pcfviana

unread,
Oct 21, 2011, 3:08:31 PM10/21/11
to dotn...@googlegroups.com
Faz tudo via codigo...

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Chamado chamado = (e.Row.DataItem as Chamado);
            CheckBox cbx = (e.Row.FindControl("cbxQualquer") as CheckBox);

            if (chamado.Codigo == 1)
            {
                cbx.Checked = true;
            }

        }
    }

2011/10/21 Celso Rivera <rivera...@gmail.com>
--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================



--
Paulo César Viana
MCP - Microsoft Certified Professional
MCTS - Microsoft Certified Technology  Specialist
(061) 8192 9092
@pcfviana

Luis Henrique Garavello Filho

unread,
Oct 21, 2011, 3:17:18 PM10/21/11
to dotn...@googlegroups.com
O campo pode ser int, mas quando vc faz o bind a célula é texto.


Luis Garavello - Desenvolvimento Financeiro
lgara...@team.br.inter.net 

Inter.net Brasil - http://www.br.inter.net 
Av. Dr Cardoso de Melo, 1.460 cj31 - Vila Olímpia 
São Paulo, SP - 04548-005 
Tel: (11) 3523-3311 | Fax: (11) 3523-3334 

Inter.net - Soluções de Internet para você e para sua empresa 

 Curta nossa página no Facebook      Siga a @Inter_Digital no Twitter


-----Mensagem original-----
De: dotn...@googlegroups.com [mailto:dotn...@googlegroups.com] Em nome
de Celso Rivera
Enviada em: sexta-feira, 21 de outubro de 2011 17:08
Para: dotn...@googlegroups.com
Assunto: Re: [.Net - BR] Gridview com checkbox

Abraços

--
Celso Rivera
rivera...@gmail.com

--

Bemjamin Quintino

unread,
Oct 21, 2011, 3:19:15 PM10/21/11
to dotn...@googlegroups.com
Uma contribuição que posso dar pra quem trabalha com Web Forms é fazer o próprio método de FindControl. O problema é que esse método não é recursivo, ou seja, ele só procura pelo controle na primeira camada do controle passado. Um exemplo disso é quando você tem 3 controles aninhados:

Controle 1
   Controle 2 
      Controle 3

Se você passar o controle 1 como parâmetro procurando pelo 3, ele não vai encontrar. O que eu sempre faço é fazer meu próprio FindControls. Passo qualquer controle e ele retorna o controle independente do nível. Quem quiser, tá ai. Se tiver alguma dica de melhora, me avisa pra eu atualizar aqui também. Por enquanto me atende perfeitamente:

        public static Control FindControls(Control controle, string nome)
        {
            Control achou = null;
            if (controle.ID == nome)
                return controle;
            foreach (Control c in controle.Controls)
            {
                if (c.ID == nome)
                {
                    achou = c;
                    break;
                }
                else
                {
                    FindControls(c, nome);
                }
            }
            return achou;
        }

        public static Control FindControls(ControlCollection controles, string nome)
        {
            Control c = null;
            foreach (Control controle in controles)
            {
                c = FindControls(controle, nome);
               if (c != null)
                   break;
            }
            return c;
        }

Valeu!
Benjamin Quintino
---
Mend your speech a little, lest it may mar your fortunes. - Shakespeare, King Lear.

Celso Rivera

unread,
Oct 21, 2011, 3:46:15 PM10/21/11
to dotn...@googlegroups.com
Pessoal, alarme falso, não funcionou com aquela linha, não deu erro na
página mas o checked não estava sendo marcado corretamente. Testei a
solução enviada pelo Paulo César e agora sim, funcionou perfeitamente.
Muito obrigado a todos.

Rogério Bragil

unread,
Oct 21, 2011, 2:49:30 PM10/21/11
to dotn...@googlegroups.com
A coluna está como TemplateField?



"Sola Scriptura, Solus Christus, Sola Gratia, Sola Fide, Soli Deo Gloria"

Rogério Fernando Bragil
Blog: http://www.bragil.net
Github: http://github.com/bragil
Twitter: @bragil
Jundiaí-SP


2011/10/21 Celso Rivera <rivera...@gmail.com>
Bom, vamos lá.

Celso Rivera

unread,
Oct 24, 2011, 7:45:11 AM10/24/11
to dotn...@googlegroups.com
Sim Rogério, template field.

Abraços

--
Celso Rivera
rivera...@gmail.com

Paulo César de França Viana pcfviana

unread,
Oct 24, 2011, 7:52:23 AM10/24/11
to dotn...@googlegroups.com
Celso, apenas confirmando: já resolveu né?

2011/10/24 Celso Rivera <rivera...@gmail.com>



--

Celso Rivera

unread,
Oct 24, 2011, 9:03:12 AM10/24/11
to dotn...@googlegroups.com
Resolvi sim Paulo César, com o código enviado por você. Obrigado.

Abraços

Em 24 de outubro de 2011 09:52, Paulo César de França Viana pcfviana
<pcfv...@gmail.com> escreveu:

Gustavo Nasser

unread,
Oct 25, 2011, 6:57:02 AM10/25/11
to DotNet Brasil
Pessoal,

Muito boa Thread, estava com o mesmas dúvidas do colega !!!
Parabéns ao nível dos integrantes.


abs,
Gustavo Nasser




On 24 out, 11:03, Celso Rivera <rivera.ce...@gmail.com> wrote:
> Resolvi sim Paulo César, com o código enviado por você. Obrigado.
>
> Abraços
>
> Em 24 de outubro de 2011 09:52, Paulo César de França Viana pcfviana
> <pcfvi...@gmail.com> escreveu:
>
>
>
>
>
> > Celso, apenas confirmando: já resolveu né?
>
> > 2011/10/24 Celso Rivera <rivera.ce...@gmail.com>
>
> >> Sim Rogério, template field.
>
> >> Abraços
>
> >> Em 21 de outubro de 2011 16:49, Rogério Bragil <bra...@gmail.com>
> >> escreveu:
> >> > A coluna está como TemplateField?
>
> >> > "Sola Scriptura, Solus Christus, Sola Gratia, Sola Fide, Soli Deo
> >> > Gloria"
>
> >> > Rogério Fernando Bragil
> >> > Blog:http://www.bragil.net
> >> > Github:http://github.com/bragil
> >> > Twitter: @bragil
> >> > Jundiaí-SP
>
> >> > 2011/10/21 Celso Rivera <rivera.ce...@gmail.com>
>
> >> >> Bom, vamos lá.
>
> >> >> Bruno, fiquei em dúvida se colocava o seu exemplo no rowdatabound ou
> >> >> na página aspx, coloquei na página aspx e deu o seguinte erro:
>
> >> >> Server Error in '/' Application.
>
> >> >> ---------------------------------------------------------------------------­-----
>
> >> >> Parser Error
> >> >> Description: An error occurred during the parsing of a resource
> >> >> required to service this request. Please review the following specific
> >> >> parse error details and modify your source file appropriately.
>
> >> >> Parser Error Message: The server tag is not well formed.
>
> >> >> Source Error:
>
> >> >> Line 31:                     <asp:TemplateField
> >> >> HeaderText="Administrador">
> >> >> Line 32:                         <ItemTemplate>
> >> >> Line 33:                             <asp:CheckBox
> >> >> ID="chkAdministrador" runat="server" Checked="<%#
> >> >> DataBinder.Eval(Container.DataItem, "Administrador")==1?"true":"false"
> >> >> %>"/>
> >> >> Line 34:                         </ItemTemplate>
> >> >> Line 35:                         <ItemStyle HorizontalAlign="Center" />
>
> >> >> Source File: /View/UsuariosAdministracao.aspx    Line: 33
>
> >> >> ---------------------------------------------------------------------------­-----
> >> >> Version Information: Microsoft .NET Framework Version:4.0.30319;
> >> >> ASP.NET Version:4.0.30319.237
>
> >> >> Rogério e Saulo, coloquei o seguinte código no rowdatabaund:
>
> >> >>            CheckBox chk =
> >> >> (CheckBox)e.Row.Cells[1].FindControl("chkAdministrador");
> >> >>            chk.Checked = true;
>
> >> >> coloquei um break point na primeira linha e o chk está como null após
> >> >> a execução. Não devia conter um objeto? Já re-chequei o nome do campo
> >> >> "chkAdministrador" e está correto. O campo é o segundo do grid, em um
> >> >> array base 0 seria o campo 1, correto?
>
> >> >> Muito obrigado
>
> >> >> Abraços
>
> >> >> --
> >> >> Celso Rivera
> >> >> rivera.ce...@gmail.com
>
> >> >> --
> >> >> ==============================
> >> >> Comunidade de desenvolvedores Dot Net no Brasil
>
> >> >> WebSite:www.dotnetbr.com
>
> >> >> E-mail do Grupo: dotn...@googlegroups.com
> >> >> ==============================
>
> >> > --
> >> > ==============================
> >> > Comunidade de desenvolvedores Dot Net no Brasil
>
> >> > WebSite:www.dotnetbr.com
>
> >> > E-mail do Grupo: dotn...@googlegroups.com
> >> > ==============================
>
> >> --
> >> Celso Rivera
> >> rivera.ce...@gmail.com
>
> >> --
> >> ==============================
> >> Comunidade de desenvolvedores Dot Net no Brasil
>
> >> WebSite:www.dotnetbr.com
>
> >> E-mail do Grupo: dotn...@googlegroups.com
> >> ==============================
>
> > --
> > Paulo César Viana
> > MCP - Microsoft Certified Professional
> > MCTS - Microsoft Certified Technology  Specialist
> > (061) 8192 9092
> > @pcfviana
>
> > --
> > ==============================
> > Comunidade de desenvolvedores Dot Net no Brasil
>
> > WebSite:www.dotnetbr.com
>
> > E-mail do Grupo: dotn...@googlegroups.com
> > ==============================
>
> --
> Celso Rivera
> rivera.ce...@gmail.com- Ocultar texto das mensagens anteriores -
>
> - Mostrar texto das mensagens anteriores -
Reply all
Reply to author
Forward
0 new messages