ASP.NET – Criando grupos e totalizações no GridView com apenas 2 linhas de código
Postado em 25/06/2009 13:06:07 por Tomás VásquezO 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 é:
{
GridViewHelper helper = new GridViewHelper(this.GridView1);
helper.RegisterSummary(“ItemTotal”, SummaryOperation.Sum);
}
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

1 comentário para “ASP.NET – Criando grupos e totalizações no GridView com apenas 2 linhas de código”
Boa Tarde.
Como faço para pegar ID do GridView agrupado?
Coloquei um LinkButton dentro da Grid.
<asp:LinkButton ID="btnDetalhe" runat="server" class="texto4" CommandArgument='’ CommandName=”Detalhe”>