Tag Archives: Agrupar

ASP.NET – Criando grupos e totalizações no GridView com apenas 2 linhas de código

O GridView, sem dúvida alguma, representa um grande avanço frente ao DataGrid do ASP.Net 1.1. Porém nossos clientes e usuários sempre necessitam de funcionalidades que vão além das fornecidas nativamente pelo GridView. Um exemplo frequente é a criação de totalizações e agrupamentos. No primeiro caso é relativamente fácil e rápido codificar o evento RowDataBound para obtenção de totais. A criação de grupos no GridView envolve um pouco mais de implementação e depuração. Há dezenas de artigos orientando tais implementações, porém eles induzem os desenvolvedores menos avisados à má prática da recodificação ao invés do reuso.

Mas é apenas quando precisamos combinar os dois recursos, grupos e sumarizações por grupo, que vemos o quanto é fácil se perder em código e depuração, caso não haja uma implementação consistente.

Com o objetivo de simplificar essas tarefas, o colega Agrinei desenvolveu uma biblioteca chamada GridViewHelper, que permite a utilização rápida e confiável de tais recursos.

A biblioteca é bem construída e simples de utilizar. A documentação é de fácil entendimento, mesmo assim, requer um bom conhecimento do controle GridView. Os resultados são bem agradáveis e torna simples algumas tarefas não tão triviais com o controle.

Alguns exemplos abaixo do que é possível obter com a biblioteca sem muito esforço, baseado nos dados do famoso banco de dados Northwind:

Sumarização

ShipRegion ShipName OrderId ProductName Quantity UnitPrice ItemTotal
RJ Hanari Carnes 10922 Alice Mutton 15 R$ 39,00 R$ 585,00
RJ Hanari Carnes 10922 Guaraná Fantástica 35 R$ 4,50 R$ 157,50
RJ Hanari Carnes 10925 Inlagd Sill 25 R$ 19,00 R$ 475,00
RJ Hanari Carnes 10925 Filo Mix 12 R$ 7,00 R$ 84,00
SP Wellington Importadora 10935 Chai 21 R$ 18,00 R$ 378,00
SP Wellington Importadora 10935 Carnarvon Tigers 4 R$ 62,50 R$ 250,00
SP Wellington Importadora 10935 Tunnbröd 8 R$ 9,00 R$ 72,00
SP Gourmet Lanchonetes 10959 Rhönbräu Klosterbier 20 R$ 7,75 R$ 155,00
SP Queen Cozinha 10961 Filo Mix 6 R$ 7,00 R$ 42,00
SP Queen Cozinha 10961 Lakkalikööri 60 R$ 18,00 R$ 1.080,00
SP Comércio Mineiro 10969 Spegesild 9 R$ 12,00 R$ 108,00
RJ Hanari Carnes 10981 Côte de Blaye 60 R$ 263,50 R$ 15.810,00
RJ Que Delícia 10989 Grandma’s Boysenberry Spread 40 R$ 25,00 R$ 1.000,00
RJ Que Delícia 10989 Queso Cabrales 15 R$ 21,00 R$ 315,00
RJ Que Delícia 10989 Jack’s New England Clam Chowder 4 R$ 9,65 R$ 38,60
R$ 20.550,10

Agrupamento

ShipName OrderId ProductName Quantity UnitPrice ItemTotal
RJ
Hanari Carnes 10922 Alice Mutton 15 R$ 39,00 R$ 585,00
Hanari Carnes 10922 Guaraná Fantástica 35 R$ 4,50 R$ 157,50
Hanari Carnes 10925 Inlagd Sill 25 R$ 19,00 R$ 475,00
Hanari Carnes 10925 Filo Mix 12 R$ 7,00 R$ 84,00
Hanari Carnes 10981 Côte de Blaye 60 R$ 263,50 R$ 15.810,00
Que Delícia 10989 Grandma’s Boysenberry Spread 40 R$ 25,00 R$ 1.000,00
Que Delícia 10989 Queso Cabrales 15 R$ 21,00 R$ 315,00
Que Delícia 10989 Jack’s New England Clam Chowder 4 R$ 9,65 R$ 38,60
SP
Wellington Importadora 10935 Chai 21 R$ 18,00 R$ 378,00
Wellington Importadora 10935 Carnarvon Tigers 4 R$ 62,50 R$ 250,00
Wellington Importadora 10935 Tunnbröd 8 R$ 9,00 R$ 72,00
Gourmet Lanchonetes 10959 Rhönbräu Klosterbier 20 R$ 7,75 R$ 155,00
Queen Cozinha 10961 Filo Mix 6 R$ 7,00 R$ 42,00
Queen Cozinha 10961 Lakkalikööri 60 R$ 18,00 R$ 1.080,00
Comércio Mineiro 10969 Spegesild 9 R$ 12,00 R$ 108,00

Agrupamento em 2 níveis

OrderId ProductName Quantity UnitPrice ItemTotal
RJ
Hanari Carnes
10922 Alice Mutton 15 R$ 39,00 R$ 585,00
10922 Guaraná Fantástica 35 R$ 4,50 R$ 157,50
10925 Inlagd Sill 25 R$ 19,00 R$ 475,00
10925 Filo Mix 12 R$ 7,00 R$ 84,00
10981 Côte de Blaye 60 R$ 263,50 R$ 15.810,00
Que Delícia
10989 Grandma’s Boysenberry Spread 40 R$ 25,00 R$ 1.000,00
10989 Queso Cabrales 15 R$ 21,00 R$ 315,00
10989 Jack’s New England Clam Chowder 4 R$ 9,65 R$ 38,60
SP
Comércio Mineiro
10969 Spegesild 9 R$ 12,00 R$ 108,00
Gourmet Lanchonetes
10959 Rhönbräu Klosterbier 20 R$ 7,75 R$ 155,00
Queen Cozinha
10961 Filo Mix 6 R$ 7,00 R$ 42,00
10961 Lakkalikööri 60 R$ 18,00 R$ 1.080,00
Wellington Importadora
10935 Chai 21 R$ 18,00 R$ 378,00
10935 Carnarvon Tigers 4 R$ 62,50 R$ 250,00
10935 Tunnbröd 8 R$ 9,00 R$ 72,00

Existem exemplos mais avançados, mas mesmo com tanos recursos, o código para proporcionar a façanha é bem simples, a biblioteca dá conta de aplicar a formatação. Por exemplo, para fazer o agrupamento pela primeira coluna, o código a ser adicionado na sua página é:

protected void Page_Load(object sender, EventArgs e)
{
GridViewHelper helper
= new GridViewHelper(this.GridView1);
helper.RegisterSummary(“ItemTotal”, SummaryOperation.Sum);
}
Bem simples e o resultado produzido é muito agradável.

Limitações

Nem tudo é perfeito, mas é preciso avaliar se é este mesmo o propósito. A biblioteca é poderosa, mas só funcionará bem quando o controle GridView trabalhar somente com BoundFields, principalmente na coluna que for agrupada. Ao tentar trabalhar com TemplateField, tive que fazer algumas modificações para que o agrupamento acontecesse. Mesmo assim, caso o controle dentro do TemplateField precisar utilizar propriedades como o CommandArgument, não funcionará pois aparentemente, após a formatação do GridView pela biblioteca, o DataBind é perdido. A razão é que, como linhas novas são adicionadas no GridView, ele se perde pois o RowIndex e outras propriedades tornam-se inválidas.

Valeu uma correção para quem tiver interesse. Afinal, a biblioteca é de código aberto.

Conclusão

Mesmo que o uso destas funcionalidades não seja tão comum, ou melhor, não façam parte das opções no seu cardápio de interfaces pois é complicado promovê-las, esta biblioteca torna-se obrigatória para quem faz uso intenso do controle GridView, principalmente para relatórios.

Site do Autor: http://www.agrinei.com/

Documentação e exemplos: http://www.agrinei.com/gridviewhelper/gridviewhelper_pt.htm

Download do código fonte: http://www.agrinei.com/gridviewhelper/gridviewhelpersample_pt.zip