Percorrendo Registros do GridView: ASP.NET com C#
Veja neste artigo como percorrer registros de um GridView, um a um, em ASP.NET, utilizando a linguagem C#.
Em determinadas situações precisamos percorrer os registros do GridView, um a um, sem utilizar a paginação do próprio que engloba grupos de páginas. Uma maneira de se fazer isso é utilizar botões para avançar, retroceder, ir ao primeiro e ao último registro da página.
Para resolver isso podemos criar uma variável que será uma lista genérica, que ficará no ViewState, recuperar os dados que queremos consultar, jogarmos os mesmos nesta lista e a utilizarmos em cada um dos botões citados acima.
Se você não conhece o ViewState sugiro que veja estes artigos.
A Listagem 01 ilustra a criação da variável citada anteriormente.
Listagem 01 – Lista armazenada no ViewState
public List<Products> listaProdutos
{
get
{
if (ViewState["vwListaProdutos"] != null)
return (List<Products>)ViewState["vwListaProdutos"];
else
return null;
}
set
{
ViewState["vwListaProdutos"] = value;
}
}
No exemplo uso uma lista genérica da classe Products, referente à tabela de mesmo nome do banco Northwind. A classe está ilustrada na Listagem 02.
Listagem 02 – Classe Products
[Serializable]
public class Products
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
}
Note que a classe tem, acima dela, a marcação que ela é uma classe do tipo Serializable (serializável), o que significa que estamos mantendo o estado do objeto/classe para o utilizarmos posteriormente em nosso desenvolvimento.
Mais informações sobre serialização Link 1, Link 2 e Link 3.
A Listagem 03 ilustra a declaração de uma variável do tipo int, no ViewState. Ela será usada na codificação dos botões.
Listagem 03 – Índice da linha, armazenado no ViewState
public Int32 indiceLinha
{
get
{
if (ViewState["vwIndiceLinha"] != null)
return (Int32)ViewState["vwIndiceLinha"];
else
return Int32.MinValue;
}
set
{
ViewState["vwIndiceLinha"] = value;
}
}
Figura 01 – Aparência da página de exemplo
Tendo em vista que já temos pronto o método para carregar os dados no GridView e o mesmo já está carregado com os dados, codifique os botões, como ilustram as Listagens 04, 05, 06 e 07.
Listagem 04 – Primeiro Registro
protected void btnPrimeiro_Click(object sender, EventArgs e)
{
if (listaProdutos != null)
{
var primeiroRegistro = listaProdutos.First();
this.txtProduto.Text = primeiroRegistro.ProductName;
this.txtPrecoUnitario.Text = primeiroRegistro.UnitPrice.ToString();
if (indiceLinha > Int32.MinValue)
this.grdDados.Rows[indiceLinha].Style.Clear();
this.grdDados.Rows[0].Style.Add("background-color", "lightgray");
indiceLinha = 0;
}
}
protected void btnUltimo_Click(object sender, EventArgs e)
{
if (listaProdutos != null)
{
var primeiroRegistro = listaProdutos.Last();
this.txtProduto.Text = primeiroRegistro.ProductName;
this.txtPrecoUnitario.Text = primeiroRegistro.UnitPrice.ToString();
if (indiceLinha > Int32.MinValue)
this.grdDados.Rows[indiceLinha].Style.Clear();
this.grdDados.Rows[listaProdutos.Count - 1].Style.Add("background-color", "lightgray");
indiceLinha = listaProdutos.Count - 1;
}
}
Listagem 06 – Próximo Registro
protected void btnProximo_Click(object sender, EventArgs e)
{
if (listaProdutos != null)
{
for (int i = 0; i < listaProdutos.Count; i++)
{
if (indiceLinha == i && indiceLinha < listaProdutos.Count - 1)
{
i++;
var proximoRegistro = listaProdutos[i];
this.txtProduto.Text = proximoRegistro.ProductName;
this.txtPrecoUnitario.Text = proximoRegistro.UnitPrice.ToString();
this.grdDados.Rows[i - 1].Style.Clear();
this.grdDados.Rows[i].Style.Add("background-color", "lightgray");
indiceLinha = i;
}
}
}
}
protected void btnAnterior_Click(object sender, EventArgs e)
{
if (listaProdutos != null)
{
for (int i = 0; i < listaProdutos.Count; i++)
{
if (indiceLinha > 0 && indiceLinha == i)
{
i--;
var proximoRegistro = listaProdutos[i];
this.txtProduto.Text = proximoRegistro.ProductName;
this.txtPrecoUnitario.Text = proximoRegistro.UnitPrice.ToString();
this.grdDados.Rows[i + 1].Style.Clear();
this.grdDados.Rows[i].Style.Add("background-color", "lightgray");
indiceLinha = i;
}
}
}
}
Note que as Listagens 04 e 05 são bem parecidas, assim como a 06 e 07 se parecem. Na Listagem 04 uso o método First(), que me retorna o primeiro registro da lista de dados, assim fica bem simples para popular os campos e pintar o GridView. Faço o mesmo na Listagem 05 com o método Last().
Nas Listagens 06 e 07 uso um laço for para verificar em que linha o usuário passou por último (daí a importância da variável declarada na Listagem 03). Dependendo do botão eu incremento ou decremento o valor de i, que é usado para pintar a linha do registro selecionado.
Não sei se a codificação usada nas Listagens 06 e 07 são as melhores (entenda-se as menores!), mais são as que, pelo menos pra mim, funcionam. Caso tenham soluções melhores postem nos comentários deste artigo, gostaria de aprendê-las.
O resultado dos testes com os botões estão ilustrados nas Figuras 02, 03, 04 e 05.Figura 02 – Primeiro Registro
Figura 03 – Último Registro
Figura 04 – Registro Anterior
Figura 05 – Próximo Registro
Assim finalizo o artigo. Muito obrigado a todos!
Um abraço, e até o próximo artigo.
Wellington Balbo de Camargo
wellingtonbalbo@gmail.com
Space do autor

código-fonte


0
0
