Tag Archives: GridView

C# – Referenciando tipos anônimos em controles DataBind

Novas funcionalidades são sempre bem vindas, mas as novidades sempre trazem mais novidades, situações, problemas, enfim, o trivial.

Os tipos anônimos do C# 3.0 economizam um bocado de tempo quando se precisa extrair algo de uma lista baseada em uma query LINQ. Vou dar um exemplo para elucidar a situação. Quando você extrai de uma determinada lista apenas alguns campos, por exemplo, do objeto:

public class Pessoa
{
	public string Nome { get; set; }
	public string SobreNome{ get; set; }
	public string Curso { get; set; }
	public string Escola { get; set; }
}

E queremos tirar uma lista única de Curso/Escola. Fácil, é só usar o Distinct, gerando algo como:

(from p in PessoaList
select new { p.Curso, p.Escola }).Distinct();

Mais fácil ainda se atribuir o resultado do código acima direto ao DataSource de um Repeater ou GridView. Mas, como fazer para coletar os valores e fazer o bind e um tipo que não existe, por exemplo, no evento ItemDataBound ou RowDataBound? Se você ativar o Watcher sobre o e.Item.DataItem, você verá um tipo anônimo referenciado de uma forma um pouco estranho. Se tentar usar no código, não funciona.

Como resolver? Não tem jeito: Reflection!

Se você tiver certeza de que a propriedade existe, dá para fazer uma referência direta:

e.Item.GetType().GetProperty("Escola").GetValue(e.Item, null)

Se houver dúvida quanto a existência, algumas verificações precisarão ser feitas. Deixo abaixo do código do colega leppie do StackOverFlow que faz tais verificações:

object o = e.Row.DataItem;
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("StringProperty");
if (pi != null && pi.PropertyType == typeof(string))
{
  // the property exists!
  string s = pi.GetValue(o, null) as string;
  // we have the value
  // insert your code here
  // PROFIT!  :)
}

Bom proveito!

Referências:

http://stackoverflow.com/questions/607433/net-databinding-referencing-anonymous-type-properties

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