Tag Archives: DataGridView

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

.NET – Corrigindo o erro DataGridViewComboBoxCell Value is not Valid

Se você ainda não esbarrou com este erro, está com sorte.

Quando acontece, é sempre no fechamento do formulário, sendo apresentado inúmeras vezes.

O erro apenas acontece se o autosizemode de uma coluna do tipo datagridviewcombobox estiver definido. Se o autosizemode não for definido, o erro não acontece.

Isso nos leva a duas situações :

O erro pode acontecer quando o autosizemode está definido a nível da DataGridView e existe uma coluna do tipo ComboBox na GridView

O erro pode acontecer quando o autosizemode está definido a nível de coluna e foi definido na coluna do tipo ComboBox

O erro ocorre porque no momento do fechamento do formulário, o formulário realiza primeiramente o dispose do datasource da coluna ComboBox. Quando o datasource é destruido e o autosize está definido, a ComboBox precisa recalcular o seu tamanho, então faz uma requisição por dados que não estão mais lá

Sem dúvida que desligar o autoSizeMode é uma solução, mas não desejamos isso, precisamos do autoSize

No momento em que o formulário for fazer o dispose do datasource da comboboxColumn, a ComboBoxColumn precisa estar com o autosizemode definido como None

Lembre-se que o autosizemode pode ser também definido no nível da grid, dai a diferença entre definir o autoSizeMode como None ou como NotSet

Então no evento form_Closed podemos simplesmente alterar o autosizemode da comboboxcolumn e com isso passaremos a poder utilizar o autoSize enquanto que o erro desaparecerá.

Lembre-se que cada coluna da DataGridView possui um nome e é uma variável acessível por código. Veja como fica :

NomeDaSuaColuna.AutoSizeMode =DataGridViewAutoSizeColumnMode.None;

Fonte: www.bufaloinfo.com.br

Abraços

Tomás Vásquez
www.tomasvasquez.com.br

Visual Studio 2005 – Extendendo o DataGridView Windows Forms

É, às vezes a Microsoft se esquece de algumas coisas, mas tenta consertar logo depois, seja por meio de patches ou através de exemplos postados em seu Knowledge Base.

Um desses esquecimentos, pelo menos que vivenciei, foi a falta do controle DateTimePicker para o .NET Compact Framework, quando me envolvi em um projeto para Pocket PCs. Apesar do controle não existir na ToolBox do Visual Studio .NET, a Microsoft o disponibiliza no site MSDN com código fonte e tudo mais. O link para o código nesta data é:
http://www.microsoft.com/downloads/details.aspx?FamilyID=11e2aa23-a6d3-441b-b622-b3a4d7695f44&DisplayLang=en

Não ter o controle pode dar um ar de imcompleteza à ferramenta, mas pensando pelo lado bom, talvez a real intenção seja mostrar o que é possível fazer com a esta. Venhamos e convenhamos, que programador se daria ao trabalho de construir do zero um DateTimePicker com todas as suas características? Acho que vale a observação.

Completando o assunto, acho que a Microsoft decidiu fazer o mesmo com o DateTimePicker para o controle DataGridView Windows Forms no Visual Studio 2005. Ele não é nativo, mas é possível adicioná-lo na nossa solução com o código também disponibilizado pela Microsoft:
http://msdn2.microsoft.com/en-us/library/7tas5c80(vs.80).aspx

Além de simplesmente embuti-lo no projeto, vale as pena uma bela olhada no código fonte.

Abraços

Tomás Vásquez