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!!
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:
- public class PersonInfo
- {
- public int Id { get; set; }
-
- public string FirstName { get; set; }
-
- public string LastName { get; set; }
-
- public DateTime BirthDate { get; set; }
- }
public class PersonInfo
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
}
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:
- public List<PersonInfo> GetPersons()
- {
- List<PersonInfo> list = new List<PersonInfo>()
- {
- new PersonInfo(){Id = 1, FirstName = "James", LastName = "Silva", BirthDate = new DateTime(1985,08,15)},
- new PersonInfo(){Id = 2,FirstName = "Antonio", LastName = "Nunes", BirthDate = new DateTime(1970,08,1)},
- new PersonInfo(){Id = 3,FirstName = "Maria", LastName = "Silva", BirthDate = new DateTime(1985,03,3)},
- new PersonInfo(){Id = 4,FirstName = "Aline", LastName = "Barros", BirthDate = new DateTime(1981,02,11)},
- new PersonInfo(){Id = 5,FirstName = "Carlos", LastName = "Barros", BirthDate = new DateTime(1972,02,11)},
- new PersonInfo(){Id = 6,FirstName = "Alda", LastName = "Celia", BirthDate = new DateTime(1982,01,20)}
- };
- return list;
- }
public List<PersonInfo> GetPersons()
{
List<PersonInfo> list = new List<PersonInfo>()
{
new PersonInfo(){Id = 1, FirstName = "James", LastName = "Silva", BirthDate = new DateTime(1985,08,15)},
new PersonInfo(){Id = 2,FirstName = "Antonio", LastName = "Nunes", BirthDate = new DateTime(1970,08,1)},
new PersonInfo(){Id = 3,FirstName = "Maria", LastName = "Silva", BirthDate = new DateTime(1985,03,3)},
new PersonInfo(){Id = 4,FirstName = "Aline", LastName = "Barros", BirthDate = new DateTime(1981,02,11)},
new PersonInfo(){Id = 5,FirstName = "Carlos", LastName = "Barros", BirthDate = new DateTime(1972,02,11)},
new PersonInfo(){Id = 6,FirstName = "Alda", LastName = "Celia", BirthDate = new DateTime(1982,01,20)}
};
return list;
}
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.

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

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

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:

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:

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:
- private void SaveCheckBoxData()
- {
- List<string> lst = (List<string>)ViewState["grid"];
-
- foreach (GridViewRow row in gvwPerson.Rows)
- {
- string id = gvwPerson.DataKeys[row.RowIndex]["Id"].ToString();
- bool isChecked = ((CheckBox)row.FindControl("chbItem")).Checked;
-
- if (isChecked)
- {
- if (lst.Contains(id) == false)
- lst.Add(id);
- }
- else
- {
- if (lst.Contains(id))
- lst.Remove(id);
- }
- }
-
- ViewState["grid"] = lst;
- lblSelected.Text = lst.Count + " Pessoas selecionadas.";
- }
private void SaveCheckBoxData()
{
List<string> lst = (List<string>)ViewState["grid"];
foreach (GridViewRow row in gvwPerson.Rows)
{
string id = gvwPerson.DataKeys[row.RowIndex]["Id"].ToString();
bool isChecked = ((CheckBox)row.FindControl("chbItem")).Checked;
if (isChecked)
{
if (lst.Contains(id) == false)
lst.Add(id);
}
else
{
if (lst.Contains(id))
lst.Remove(id);
}
}
ViewState["grid"] = lst;
lblSelected.Text = lst.Count + " Pessoas selecionadas.";
}
Vamos criar o método LoadCheckBoxData(), que irá marcar os checkboxes de acordo com o que tem na nossa lista de strings na ViewState:
- private void LoadCheckBoxData()
- {
- List<string> lst = (List<string>)ViewState["grid"];
-
- foreach (GridViewRow row in gvwPerson.Rows)
- {
- string id = gvwPerson.DataKeys[row.RowIndex]["Id"].ToString();
-
- if (lst.Contains(id))
- {
- CheckBox checkBox = (CheckBox)row.FindControl("chbItem");
- checkBox.Checked = true;
- }
- }
- }
private void LoadCheckBoxData()
{
List<string> lst = (List<string>)ViewState["grid"];
foreach (GridViewRow row in gvwPerson.Rows)
{
string id = gvwPerson.DataKeys[row.RowIndex]["Id"].ToString();
if (lst.Contains(id))
{
CheckBox checkBox = (CheckBox)row.FindControl("chbItem");
checkBox.Checked = true;
}
}
}
Devemos inicializar nossa lista de strings no nosso page_load:
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- List<string> list = new List<string>();
- ViewState["grid"] = list;
- }
- }
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List<string> list = new List<string>();
ViewState["grid"] = list;
}
}
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).
- protected void chbAll_CheckedChanged(object sender, EventArgs e)
- {
- CheckBox CheckBoxTodos = (CheckBox)gvwPerson.HeaderRow.FindControl("chbAll");
-
- foreach (GridViewRow row in gvwPerson.Rows)
- {
- CheckBox checkBox = (CheckBox)row.FindControl("chbItem");
- checkBox.Checked = CheckBoxTodos.Checked;
-
- SaveCheckBoxData();
- }
- }
protected void chbAll_CheckedChanged(object sender, EventArgs e)
{
CheckBox CheckBoxTodos = (CheckBox)gvwPerson.HeaderRow.FindControl("chbAll");
foreach (GridViewRow row in gvwPerson.Rows)
{
CheckBox checkBox = (CheckBox)row.FindControl("chbItem");
checkBox.Checked = CheckBoxTodos.Checked;
SaveCheckBoxData();
}
}
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)
Tags: C#, C#.net, Visual Studio, Visual Studio 2010, csharp, ASP.net, checkBox na Gridview