Jun 14 2011

ASP.net Como Manter Valores de CheckBox na GridView

Category: asp.net | C#Suzuki @ 08:09

Olá pessoal.
Depois de um tempo sem postar assuntos relacionados ao .Net Framework, C# e ASP.net, voltamos apresentando mais uma dica.
O dificil foi encontrar um tema para este conteúdo, então algumas respostas que podem ser encontradas aqui: como inserir um CheckBox na GridView no ASP.net, como manter o valor do CheckBox na gridview do ASP.net, como persistir o CheckBox na GridView do ASP.net, CheckBox perde valor ao navegar na paginação da GridView, entre outros.
Neste artigo, demonstrarei um forma de fazer com que o CheckBox mantenha o valor mesmo após a gente paginar na gridview, para isso vou usar uma postagem anterior para pegar alguns códigos que ja apresentamos aqui.

Vamos para a ação!! Smiley sexy
Vou pegar a classe PersonInfo da postagem Reportviewer Relatório com Agrupamento http://www.ninjacode.com.br/post/2011/02/01/Reportviewer-Relatorio-com-Agrupamento.aspx
Adicionarei uma propriedade Id para a mesma, veja abaixo:

  1. public class PersonInfo   
  2. {   
  3.     public int Id { getset; }   
  4.   
  5.     public string FirstName { getset; }   
  6.   
  7.     public string LastName { getset; }   
  8.   
  9.     public DateTime BirthDate { getset; }   
  10. }  

Vamos pegar ainda outro método do artigo Reportviewer Relatório com Agrupamento, o método GetPersons() torna-lo public e adicionar a propriedade Id, para emularmos uma pesquisa.
Fica assim:

  1. public List<PersonInfo> GetPersons()   
  2. {   
  3.     List<PersonInfo> list = new List<PersonInfo>()   
  4.     {   
  5.          new PersonInfo(){Id = 1, FirstName = "James", LastName = "Silva", BirthDate = new DateTime(1985,08,15)},   
  6.          new PersonInfo(){Id = 2,FirstName = "Antonio", LastName = "Nunes", BirthDate = new DateTime(1970,08,1)},   
  7.          new PersonInfo(){Id = 3,FirstName = "Maria", LastName = "Silva", BirthDate = new DateTime(1985,03,3)},   
  8.          new PersonInfo(){Id = 4,FirstName = "Aline", LastName = "Barros", BirthDate = new DateTime(1981,02,11)},   
  9.          new PersonInfo(){Id = 5,FirstName = "Carlos", LastName = "Barros", BirthDate = new DateTime(1972,02,11)},   
  10.          new PersonInfo(){Id = 6,FirstName = "Alda", LastName = "Celia", BirthDate = new DateTime(1982,01,20)}   
  11.     };   
  12.     return list;   
  13. }  

Com isso estas duas classes eu adicionei na pasta AppCode do meu webSite, para que possamos utilizar em nossas webPages.
A partir de agora na pagina Default.aspx, inclui um GridView, e escolhi um novo DataSource para esta GridView, informando meu objeto PersonInfo, e minha classe de negócios PersonBll, com isso o grid ja irá incluir as colunas automaticamente, alem disso setei um Auto Format para que o grid tenha um estilo e não fique tão simples. Lembre-se de habilitar o Paging da grid.
Agora que temos a grid vamos adicionar o CheckBox, e pra fazer isso vamos colocar um campo TemplateField, selecione o EditColumns.

CheckBox_Grid_01

Em seguida adicione o TemplateField e mova para o inicio como abaixo:

CheckBox_Grid_02

Depois de clicar em Ok, vamos editar a GridView, em específico a opção Edit Templates:

CheckBox_Grid_03

Assim, selecionando a opção ItemTemplate, adicione um novo CheckBox e renomei para chbItem, ajuste a propriedade AutoPostBack igual a true, e ja deixe adicionado o evento checkedChange para o mesmo:

CheckBox_Grid_04

Vamos fazer um processo semelhante com o HeaderTemplate, adicionar um CheckBox e renomear para chbAll, ajuste a propriedade AutoPostBack igual a true, e ja deixe adicionado o evento checkedChange para o mesmo:

CheckBox_Grid_05

Logo abaixo da grid adicionei um label (com o nome lblSelected), para que possa nos informar quanto itens da grid estão selecionados, não é um componente obrigatório pra ser incluído porem deixa o exemplo mais didático.
Diminui a quantidade de registros pra paginação entrar em ação, deixei apenas 3 linhas, e na propriedade DataKeyNames, inclua a propriedade Id(Este é um passo importante para que possamos saber buscar unicamente o registro para remarca-lo quando necessário e poder grava-lo).
A partir de agora, vamos para o .cs implementar o código que irá gravar os valores e carrega-los.
Vamos criar o SaveCheckBoxData(), que irá gravar uma lista de strings na ViewState:

  1. private void SaveCheckBoxData()   
  2. {   
  3.     List<string> lst = (List<string>)ViewState["grid"];   
  4.   
  5.     foreach (GridViewRow row in gvwPerson.Rows)   
  6.     {   
  7.         string id = gvwPerson.DataKeys[row.RowIndex]["Id"].ToString();   
  8.         bool isChecked = ((CheckBox)row.FindControl("chbItem")).Checked;   
  9.   
  10.         if (isChecked)   
  11.         {   
  12.             if (lst.Contains(id) == false)   
  13.                 lst.Add(id);   
  14.         }   
  15.         else  
  16.         {   
  17.             if (lst.Contains(id))   
  18.                 lst.Remove(id);   
  19.         }   
  20.     }   
  21.   
  22.     ViewState["grid"] = lst;   
  23.     lblSelected.Text = lst.Count + " Pessoas selecionadas.";   
  24. }  

Vamos criar o método LoadCheckBoxData(), que irá marcar os checkboxes de acordo com o que tem na nossa lista de strings na ViewState:

  1. private void LoadCheckBoxData()   
  2. {   
  3.     List<string> lst = (List<string>)ViewState["grid"];   
  4.   
  5.     foreach (GridViewRow row in gvwPerson.Rows)   
  6.     {   
  7.         string id = gvwPerson.DataKeys[row.RowIndex]["Id"].ToString();   
  8.   
  9.         if (lst.Contains(id))   
  10.         {   
  11.             CheckBox checkBox = (CheckBox)row.FindControl("chbItem");   
  12.             checkBox.Checked = true;   
  13.         }   
  14.     }   
  15. }  

Devemos inicializar nossa lista de strings no nosso page_load:

  1. protected void Page_Load(object sender, EventArgs e)   
  2. {   
  3.     if (!IsPostBack)   
  4.     {   
  5.         List<string> list = new List<string>();   
  6.         ViewState["grid"] = list;   
  7.     }   
  8. }  

Eventos importantes que devemos chamar nossos métodos:
PageIndexChanging da GridView e CheckedChanged do checkbox do ItemTamplate deve mos incluir a chamada ao metodo SaveCheckBoxData();.
No evento DataBound da GridView insira a chamada ao metodo LoadCheckBoxData();.
Esta quase pronto para o funcionamento, o evento CheckedChanged do chbAll, checkBox do HeaderTemplate. Iremos implementar uma funcionalidade que ao marcar ou desmacar o CheckBox ira fazer o mesmo com todos os itens do grid, apenas da pagina que esta em exeibição(lembrando que seu grid pode estar paginado devido a quantidade de registros).

  1. protected void chbAll_CheckedChanged(object sender, EventArgs e)   
  2. {   
  3.     CheckBox CheckBoxTodos = (CheckBox)gvwPerson.HeaderRow.FindControl("chbAll");   
  4.   
  5.     foreach (GridViewRow row in gvwPerson.Rows)   
  6.     {   
  7.         CheckBox checkBox = (CheckBox)row.FindControl("chbItem");   
  8.         checkBox.Checked = CheckBoxTodos.Checked;   
  9.   
  10.         SaveCheckBoxData();   
  11.     }   
  12. }  

Pronto!
Compile, execute e faça o debug.
Caso você deseje realizar o download do projeto --> CheckBoxGridSample.zip (3.26 kb)
Até a próxima.

 

E disse o Senhor: Se tivésseis fé como um grão de mostarda, diríeis a esta amoreira: Desarraiga-te daqui, e planta-te no mar; e ela vos obedeceria. (Lucas 17:6)

Share or Bookmark this post…

Tags: , , , , , ,

Kommentare

1.
pingback thiagosatoshisuzuki.wordpress.com says:

Pingback from thiagosatoshisuzuki.wordpress.com

ASP.net Como Manter Valores de CheckBox na GridView « Thiago Satoshi Suzuki

2.
Kleber Kleber Brazil says:

Olá, agradeço muitíssimo pela sua matéria. Me ajudou bastante.
Abraço

Voeg kommentaar By


(Sal you Gravatar ikone vertoon)

  Country flag

biuquote
  • Opmerkings
  • Voorskou
Loading