Selecionar varios registros – CheckBox em GridView

Durante o desenvolvimento de seus projetos, você já pode ter passado pela seguinte situação: tem-se uma coleção de dados exibidas em um GridView e deseja selecionar um ou vários registros para efetuar alguma ação. Nesse artigo, veremos como selecionar vários Checkbox, repetido nas colunas de um GridView e capturar o valor do identificador dessas colunas.
Análise da aplicação
Primeiramente, deve-se entender que, são “n” situações possíveis onde se necessita selecionar vários checkbox, porém, neste exemplo em questão, teremos um gridview contendo algumas categorias, onde se devem selecionar as que terão relacionamento com um determinado cliente. Lembrando que, o foco do artigo não é a criação da aplicação (incluindo criação de banco e inserção de dados).
Populando o GridView
Supondo que tenhamos uma tabela tbCategoria com os seguintes campos: Id (int) e Nome (nvarchar(100)). Os dados desta tabela serão exibidos através de um GridView, que terá as colunas respectivas aos campos e um CheckBox, vejam na figura 1:
Figura 1 – GridView Categorias
Abaixo segue código de criação:
<asp:GridView ID="gvSubCategoria" runat="server" CellPadding="4" DataKeyNames="Id"
        ForeColor="#333333" Width="230px" AutoGenerateColumns="False" GridLines="None"
        DataSourceID="sdsCategorias">
        <RowStyle BackColor="#E3EAEB" />
        <Columns>
            <asp:TemplateField HeaderText="Categorias">
                <ItemTemplate>
                    <asp:CheckBox ID="cbItem" runat="server" />
                    <asp:Label ID="lblIdCategoria" runat="server" Text='<%# Eval("Id") %>' Style="font-family: Arial;
                        font-size: small"></asp:Label>
                    <asp:Label ID="lblNomeCategoria" runat="server" Text='<%# Eval("Nome") %>' Style="font-family: Arial;
                        font-size: small"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
        <HeaderStyle BackColor="#7088c5" Font-Bold="True" ForeColor="White" />
        <EditRowStyle BackColor="#7C6F57" />
        <AlternatingRowStyle BackColor="White" />
    </asp:GridView>
    <asp:SqlDataSource ID="sdsCategorias" runat="server" ConnectionString="<%$ ConnectionStrings:csArtigo %>"
        SelectCommand="SELECT [Id], [Nome] FROM [tbCategoria]"></asp:SqlDataSource>
O código acima cria um GridView customizado, preenchido através do SqlDataSource “sdsCategorias”, e suas colunas foram criadas dentro de um TemplateField, com intuído de criar um CheckBox “cbItem”, para cada linha de resultado da busca. Pronto, agora que o grid foi preenchido, adicionaremos um button “btnCadastrar”, onde este irá capturar os “id”s das linhas foram selecionadas através do CheckBox.
Após adicionar o botão, em seu método onclick, adicione o seguinte código:
for (int i = 0; i <= gvCategoria.Rows.Count - 1; i++)
        {
            GridViewRow dgItem = gvCategoria.Rows[i];
            CheckBox cb = (CheckBox)dgItem.FindControl("cbItem");

            if (cb.Checked)
            {
                Label lblId = (Label)dgItem.FindControl("lblIdCategoria");
                Label lblNome = (Label)dgItem.FindControl("lblNomeCategoria");
                Response.Write(lblId.Text + " - " + lblNome.Text + "<br />");
            }

        }
Percebam que, foi criado um laço de repetição onde irá percorrer todo resultado exibido no GridView, linha por linha. Foi criado um dgItem do tipo GridViewRow, para que, através do método FindControl possa encontrar o CheckBox “cbItem”.
Utilizando a instrução de controle “if” verificamos se este CheckBox está selecionado, caso esteja, serão criadas duas Labels (lembrando que são Labels por que no GridView foram adicionadas Labels para armazenar os valores de Id e Nome) que receberão seus valores, novamente utilizando o método FindControl do dgItem.
Por fim, foi utilizado o Response.Write para “imprimir” os valores selecionados na grid.
Observe na figura 2 a aplição completa:

Figura 2 – Gridview selecionado
Veja abaixo o código completo do exemplo:
Aspx
<asp:GridView ID="gvCategoria" runat="server" CellPadding="4" DataKeyNames="Id"
        ForeColor="#333333" Width="230px" AutoGenerateColumns="False" GridLines="None"
        DataSourceID="sdsCategorias">
        <RowStyle BackColor="#E3EAEB" />
        <Columns>
            <asp:TemplateField HeaderText="Categorias">
                <ItemTemplate>
                    <asp:CheckBox ID="cbItem" runat="server" />
                    <asp:Label ID="lblIdCategoria" runat="server" Text='<%# Eval("Id") %>' Style="font-family: Arial;
                        font-size: small"></asp:Label>
                    <asp:Label ID="lblNomeCategoria" runat="server" Text='<%# Eval("Nome") %>' Style="font-family: Arial;
                        font-size: small"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
        <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
        <HeaderStyle BackColor="#7088c5" Font-Bold="True" ForeColor="White" />
        <EditRowStyle BackColor="#7C6F57" />
        <AlternatingRowStyle BackColor="White" />
    </asp:GridView>
    <asp:SqlDataSource ID="sdsCategorias" runat="server" ConnectionString="<%$ ConnectionStrings:csArtigo %>"
        SelectCommand="SELECT [Id], [Nome] FROM [tbCategoria]"></asp:SqlDataSource>
    <br />
    <asp:Button ID="btnCadastrar" runat="server" Text="Cadastrar"
        onclick="btnCadastrar_Click" />
C#
protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnCadastrar_Click(object sender, EventArgs e)
    {
        for (int i = 0; i <= gvCategoria.Rows.Count - 1; i++)
        {
            GridViewRow dgItem = gvCategoria.Rows[i];
            CheckBox cb = (CheckBox)dgItem.FindControl("cbItem");

            if (cb.Checked)
            {
                Label lblId = (Label)dgItem.FindControl("lblIdCategoria");
                Label lblNome = (Label)dgItem.FindControl("lblNomeCategoria");
                Response.Write(lblId.Text + " - " + lblNome.Text + "<br />");
            }

        }
    }
Foi criado assim, um GridView que contem caixas de seleção, e um botão, que escreve na tela os valores que foram selecionados no grid.

3 Responses so far.

  1. e ai nicolas, ta famoso hem...rs....

  2. Quem me dera hahaha ..

    Muito tempo que não posto no blog :(

    Tudo bem com você meu amigo ?

  3. Nycolas, Fiquei muito feliz quando vi essa postagem, pois estava procurando algo parecido.

    Fiz tudo só que tive um problema. tenho uma tabela empresa que contem duas cadastradas. Fiz o grid em cima dela. ao rodar, marquei somente uma, só que no evento do botão ao passar no código if (cb.Checked) ele fala que não está marcado. Mesmo eu marcando todas as empresas. O que pode ser?. Estou usando o Visual Studio 2010. No aguardo da sua ajuda.

Leave a Reply