Desenvolvimento - ASP. NET

ASP.NET MVC 3 – Customizando o WebGrid

Nesse artigo veremos como é fácil customizar uma WebGrid, faremos a formatação (Customização) das colunas do WebGrid, esse novo recurso do ASP.NET MVC 3. Temos propriedades para customizar praticamente toda a grid e ainda propriedades para interagir com ela.

por André Baltieri



Introdução

No artigo anterior, mostrei como podemos de forma simples e fácil, implementar a tabulação de dados com o novo recurso do ASP.NET MVC 3, o WebGrid. Este recurso está disponível tanto para as Views em ASP.NET quanto para as Views em Razor.

A medida que utilizamos o WebGrid, a formatação (Customização) das colunas se faz cada vez mais necessária, e neste artigo veremos como podemos formatar estas colunas.

Propriedades do WebGrid

O webGrid possui uma ampla gama de propriedades para sua customização, porém necessitamos apenas de algumas para iniciar o uso do WebGrid:

  • Source – Fonte de dados.
  • DefaultSort – Campo a ser ordenado quando a tabela for gerada.
  • RowsPerPage – Linhas por página. Esta propriedade só funcionará se a paginação estiver ativa.
  • CanPage – Paginar ou não os dados.
  • CanSort – Ordenar ou não os dados. Posteriormente podemos dizer que uma coluna não poderá ser ordenada.

Sendo assim, um exemplo inicial da customização de uma WebGrid seria este:

   1: var gridItens = new WebGrid(source: Model,

   2:     defaultSort: "Title",

   3:     rowsPerPage: 15,

   4:     canPage: true,

   5:     canSort: true);

Até então nada de novo, porém, vamos começar pela propriedade “fieldNamePrefix”, que tem por finalidade adicionar um prefixo ao cabeçalho da WebGrid para ordenação e paginação.

FieldNamePrefix

A principio pode parecer sem muita utilidade, mas se pensarmos num contexto onde podemos ter UserControls com WebGrids, é importante definir um prefixo para os campos, já que a URL irá mudar (Ele usa método GET) e sendo assim os parâmetros podem ser confundidos.

Primeiro vamos ver como fica a URL quando ordenamos a WebGrid:

Note que ele utilizou o nome da coluna como parâmetro. No caso, seria interessante ter um prefixo informando pelo menos qual WebGrid está sendo ordenada, e é aí que entra o “fieldNamePrefix”, como demonstrado abaixo:

   1: var gridItens = new WebGrid(source: Model,

   2:     defaultSort: "Title",

   3:     rowsPerPage: 15,

   4:     canPage: true,

   5:     canSort: true,

   6:     fieldNamePrefix: "gridItens_");

Agora podemos notar que a URL não é mais a mesma na ordenação, e se olharmos o HTML, o mesmo também tem o prefixo “gridItens_” adicionado.

Se olharmos o código fonte, poderemos ver que o mesmo prefixo está presente lá:

PageFieldName

A propriedade PageFieldName serve para customizar o parâmetro do nome da página ao paginar os dados. É importante pelo mesmo motivo do FieldNamePrefix.

Se notarmos uma URL onde não temos o “pageFieldName” e uma que temos, podemos claramente ver a diferença.

   1: var gridItens = new WebGrid(source: Model,

   2:     defaultSort: "Title",

   3:     rowsPerPage: 5,

   4:     canPage: true,

   5:     canSort: true,

   6:     fieldNamePrefix: "gridItens_",

   7:     pageFieldName: "inside");

Sem PageFieldName

Com PageFieldName

Podemos ver que com PageFieldName identificamos de qual grid é a paginação.

SelectionFieldName

A propriedade selectionFieldName permite customizar o nome dado ao parâmetro referente a linha selecionada da WebGrid. Deste modo temos:

   1: var gridItens = new WebGrid(source: Model,

   2:     defaultSort: "Title",

   3:     rowsPerPage: 5,

   4:     canPage: true,

   5:     canSort: true,

   6:     fieldNamePrefix: "gridItens_",

   7:     pageFieldName: "inside",

   8:     selectionFieldName: "selectedRow");

Sem SelectionFieldName

Com SelectionFieldName

Note que ele combina o fieldNamePrefix com o selectionFieldName que customizamos.

Nota: O mesmo se aplica para os parâmetros SortFieldName e SortDirectionFieldName e sendo assim não abordarei os mesmos aqui.

Estilizando a Grid

Outro ponto forte do WebGrid é o poder de customização que ele tem, e tudo via CSS. Podemos atribuir estilos para a grid no geral, como cabeçalho e rodapé, ou posteriormente estilizar as células de cada linha da tabela.

Dentro do método GetHtml, podemos especificar então quais estilos o cabeçalho, rodapé e outros itens da grid vão utilizar. Veja o exemplo abaixo:

   1: gridItens.GetHtml(

   2:     tableStyle: "webgrid",

   3:     headerStyle: "webgrid-header",

   4:     footerStyle: "webgrid-footer",

   5:     alternatingRowStyle: "webgrid-alternating-row",

   6:     selectedRowStyle: "webgrid-selected-row",

   7:     rowStyle: "webgrid-row-style")

Desta forma, sem definir nenhum CSS ainda, temos a seguinte grid:

Porém, aplicando simples estilos (Somente CSS, sem imagens nem nada) podemos ter visuais mais ricos, como este:

O CSS utilizado para customizar esta WebGrid está abaixo.

   1: .webgrid

   2: {

   3:     width: 50%;

   4:     border: 0px;

   5:     border-collapse: collapse;

   6: }

   7:

   8: .webgrid a

   9: {

  10:     color: #000;

  11: }

  12:

  13: .webgrid-header

  14: {

  15:   padding: 6px 5px;

  16:   text-align: center;

  17:   background-color: #e8eef4;

  18:   border-bottom: 2px solid #3966A2;

  19:   height: 40px;

  20:

  21:   border-top: 2px solid #D6E8FF;

  22:   border-left: 2px solid #D6E8FF;

  23:   border-right: 2px solid #D6E8FF;

  24: }

  25:

  26: .webgrid-footer

  27: {

  28:   padding: 6px 5px;

  29:   text-align: center;

  30:   background-color: #e8eef4;

  31:   border-top: 2px solid #3966A2;

  32:   height: 30px;

  33:

  34:   border-bottom: 2px solid #D6E8FF;

  35:   border-left: 2px solid #D6E8FF;

  36:   border-right: 2px solid #D6E8FF;

  37: }

  38:

  39: .webgrid-alternating-row

  40: {

  41:     height: 30px;

  42:     background-color: #f2f2f2;

  43:     border-bottom: 1px solid #d2d2d2;

  44:

  45:     border-left: 2px solid #D6E8FF;

  46:     border-right: 2px solid #D6E8FF;

  47: }

  48:

  49: .webgrid-row-style

  50: {

  51:     height: 30px;

  52:     border-bottom: 1px solid #d2d2d2;

  53:

  54:     border-left: 2px solid #D6E8FF;

  55:     border-right: 2px solid #D6E8FF;

  56: }

  57:

  58: .webgrid-selected-row

  59: {

  60:     font-weight: bold;

  61:     background-color: #E3DFFF;

  62: }

Customizando as Colunas

Além de poder customizar a WebGrid de uma forma geral, podemos customizar o modo como as colunas serão visualizadas, incluindo seu conteúdo. O código abaixo mostra a criação de colunas no WebGrid.

   1: columns: gridItens.Columns(

   2:

   3:     gridItens.Column(

   4:         columnName: "Title",

   5:         header: "Título",

   6:         style: "text-align-left"),

   7:

   8:     gridItens.Column(

   9:         columnName: "Price",

  10:         header: "Preço",

  11:         style: "text-align-center",

  12:         format: (item) => string.Format("{0:C}", item.Price)),

  13:

  14:     gridItens.Column(

  15:         columnName: "Quantity",

  16:         header: "Qtd em Estoque",

  17:         style: "text-align-center")

  18: )

Podemos notar que temos o nome da coluna, que se refere a propriedade do Model carregado (Neste exemplo utilizei uma lista de Product, sendo assim, o ColumnName se refere a propriedade do produto que queremos exibir, como Title, Price e Quantity).

O header identifica o cabeçalho e o style o estilo (Ligado ao CSS) da célula. Ainda temos a propriedade CanSort que permite ou não que uma coluna seja ordenada.

Por fim, temos a propriedade Format, que nos dá a flexibilidade de customizar o valor da coluna. No código acima por exemplo, formatamos o preço para o mesmo ser exibido com moeda.

O Format utiliza uma lambda expression para dinamicamente poder acessar as propriedades do item em questão. Show de bola =D.

Nas colunas onde o texto deve ser alinhado ao centro, temos a estilização via CSS (Pelo estilo “text-align-center”) para fazer isto.

Selecionando Registros

Ainda falando sobre o Format, algo que vim buscando esses dias foi a questão da seleção de uma linha da WebGrid, para assim poder manipular seus dados. Após várias buscas, descobri que pelo Format conseguimos criar uma coluna especial para seleção.

   1: gridItens.Column(

   2:     header:"",

   3:     style: "text-align-center",

   4:     format:(item) => item.GetSelectLink()),

Podemos notar que novamente temos uma lambda, só que desta vez chamamos o método GetSelectLink(), que está presente por padrão nos itens da WebGrid. Simples assim. E o resultado é este:

Com a linha selecionada, um novo leque de opções se abre, e podemos manipular os dados da WebGrid de forma fácil e tipada, pois o retorno da linha selecionada é um objeto do tipo do item (Que veio do Model – Neste caso um Product).

Abaixo o código para ler o produto selecionado:

   1: CustomWebGrid.Models.Product product = new CustomWebGrid.Models.Product();

   2:

   3: if (gridItens.HasSelection)

   4: {

   5:     product = (CustomWebGrid.Models.Product)gridItens.Rows[gridItens.SelectedIndex].Value;

   6: }

   7: else

   8: {

   9:     product = (CustomWebGrid.Models.Product)gridItens.Rows[0].Value;

  10: }

Depois podemos exibir os dados na tela, já que temos um produto.

   1: <b>Título:</b> <%: product.Title %><br />

   2: <b>Preço:</b> <%: product.Price %><br />

   3: <b>Quantidade:</b> <%: product.Quantity %><br />

   4: <br />

E o resultado é este:

Bônus: Para exibir o total de registros, utilize a propriedade “gridItens.TotalRowCount”.

Conclusão

Neste artigos vimos como é fácil customizar uma WebGrid, e como ela dá uma cara nova às nossas aplicações. Temos propriedades para customizar praticamente toda a grid e ainda propriedades para interagir com ela.

Podemos esperar ainda mais melhorias nas próximas versões.

Até o próximo artigo!

André Baltieri

André Baltieri - Trabalha com desenvolvimento de aplicações web a mais de 7 anos, e com ASP.NET desde 2003. É líder da comunidade Inside .NET (http://www.insidedotnet.com.br/) e do projeto Learn MVC .NET (http://learn-mvc.net/). Bacharelando em Sistemas de Informação, atualmente trabalha com desenvolvimento e suporte de aplicações web em ASP.NET/C# em projetos internacionais e ministra treinamentos e consultorias sobre a plataforma .NET.