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

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
- Editado Marcos Paulo P.M quarta-feira, 18 de março de 2015 12:56 d
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
-
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
-
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