none
Manter CheckBox paginação e percorrer todos os CheckBox do Grid para salvar no banco RRS feed

  • Pergunta

  • C# asp.net

    Bom dia galera,

    estou precisando desenvolver uma função que parecia simples, mas  depois de muito pesquisar descobri que não é tão simples assim.

    Estou precisando de uma ou duas funções para percorrer um grid com várias páginas, e manter o checkbox selecionado quando o usuário trocar de página, depois disso, quando o usuário terminar de marcar todos os itens em todas as páginas, preciso percorrer esses checkboxs selecionados nas diversas páginas e salvar as informações no banco de dados.

    Achei algumas funções para manter o checkbox marcado, mas n funcionaram, e a principal, que é percorrer todas as páginas do grid e salvar os checks marcados, essa não achei por nada. alguém teria alguma idéia de como fazer?

    Li uma vez em algum lugar que não tem como percorrer as páginas do Grid para salvar informações, que o método que percorre o Grid só salva a página em que ele se encontra.

    Alguém pra ajudar????


    Marcos Paulo - Analista de Sistemas


    quarta-feira, 18 de março de 2015 12:56

Todas as Respostas

  • Ola Marcos,

        Existem varias soluções, mas vou indicar 2 delas e o porque de cada uma.

        A primeira consite em criar uma lista para gravar os itens conforme forem sendo checados (ou remover conforme sendo deschecados). A inclusão / remoção dos itens pode ser feita no evento de click do checkbox da grid... Essa seria a solução mais rapida de ser implementada, eu acredito..

       Particulamente, eu optaria por criar uma propriedade booleana para marcar se o item esta ou nao checado na classe de dados que utlizei para popular essa lista... toda vez que o checkbox for clicado alterar-se o valor da propriedade (se possivel ja criar um bind dessa propriedade com o checkbox melhor ainda). No final, com uma simples query Linq voce retornaria todos os registros checados...

       Lembrando que para as duas soluçoes voce vai ter que persistir os dados entre as postagens... mas isso voce pode fazer utilizando ViewState


    Microsoft Community Contributor

    quinta-feira, 19 de março de 2015 02:07
    Moderador
  • Ola Marcos,

        Existem varias soluções, mas vou indicar 2 delas e o porque de cada uma.

        A primeira consite em criar uma lista para gravar os itens conforme forem sendo checados (ou remover conforme sendo deschecados). A inclusão / remoção dos itens pode ser feita no evento de click do checkbox da grid... Essa seria a solução mais rapida de ser implementada, eu acredito..

       Particulamente, eu optaria por criar uma propriedade booleana para marcar se o item esta ou nao checado na classe de dados que utlizei para popular essa lista... toda vez que o checkbox for clicado alterar-se o valor da propriedade (se possivel ja criar um bind dessa propriedade com o checkbox melhor ainda). No final, com uma simples query Linq voce retornaria todos os registros checados...

       Lembrando que para as duas soluçoes voce vai ter que persistir os dados entre as postagens... mas isso voce pode fazer utilizando ViewState


    Microsoft Community Contributor

    Bom dia Rui,

    Você teria algum exemplo para que eu possa me basear?? Não trabalhei ainda com query link, se tivesse algum exemplo pra ajudar a refrescar a cabeça te agradeço...


    Marcos Paulo - Analista de Sistemas

    quinta-feira, 19 de março de 2015 13:55
  • Ola Marcos,

       Vou mostrar um exemplo da primeira solução que é mais simples e não envolve Linq. 

    <%@ Page Language="C#" AutoEventWireup="true" %>
    
    <!DOCTYPE html>
    <script runat="server">   
        // Metodo quando o checbox é alterado
        protected void DataSelectedChanged(object sender, EventArgs e)
        {
            // CheckBox que teve o valor alterado
            CheckBox checkBox = sender as CheckBox;
            
            // Id do registro que foi (des)selecionado
            int id = Convert.ToInt32(checkBox.Attributes["data-id"]);
            
            // Situação do checkbox atual
            bool selecionado = checkBox.Checked;
    
            // Carregar lista com os valores ja selecionados (Pesquisar por ViewState caso não conheça seu funcionanmento)
            var lista = (List<Int32>)ViewState["ItemsSelecionados"];
            // Se não tiver registros na lista, cria uma nova instancia
            if (lista == null) lista = new List<int>();
            
            if (selecionado == true)
            {
                // Se o valor foi selecionado:
                lista.Add(id);
            }
            else
            {
                // Se foi desselecionado
                lista.Remove(id);
            }
            
            // Persite os dados na ViewState:
            ViewState["ItemsSelecionados"] = lista;
        }
    
        // Retornando uma lista com todos os ID selecionados
        public int[] ItensSelecionados()
        {
            var lista = (List<Int32>)ViewState["ItemsSelecionados"];
    
            if (lista == null)
            {
                return new int[0];
            }
            else
            {
                return lista.ToArray();
            }
        }
    </script>
    
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>   
            <asp:GridView ID="gridView" runat="server" AllowPaging="True" AutoGenerateColumns="False" Width="100%">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <!-- Usar o atributo customizado data-id para armazenar o ID do registro -->
                            <asp:CheckBox runat="server" OnCheckedChanged="DataSelectedChanged" data-id='<%# Eval("ID") %>' />
                        </ItemTemplate>
                        <ItemStyle HorizontalAlign="Center" Width="20px" />
                    </asp:TemplateField>
                    <asp:BoundField DataField="Teste" />
                </Columns>
            </asp:GridView>    
        </div>
        </form>
    </body>
    </html>
    

    Lembrando que o ViewState é uma forma de acesso a um campo oculto (HiddenField) então mantem a persistencia na pagina entre a paginação

    E que exite uma outra forma de tratar variaveis nulas que pode ser usada neste contesto:

    // No lugar de
    var lista = (List<Int32>)ViewState["ItemsSelecionados"];
    if (lista == null) lista = new List<int>();
    
    // Use
    var lista = (List<Int32>)ViewState["ItemsSelecionados"] ?? new List<Int32>();
    



    Microsoft Community Contributor

    quarta-feira, 24 de junho de 2015 14:41
    Moderador