Há casos onde necessitamos somar o valor de uma determinada coluna do controle GridView de uma aplicação ASP.NET, onde é exibido ao usuário um valor total/soma para conferência no final desta coluna. Para isso utilizaremos um GridView onde será exibido o conteúdo de uma coluna da Base de Dados e a sua somatória.
A solução para isso é utilizar o evento RowDataBound do controle GridView, evento qual é disparado a cada linha que está sendo criada pelo controle. Antes de mais nada, depois de criado o GridView no WebForm, devemos habilitar o mesmo para exibir a seção Footer, marcando a propriedade Show Footer através da janela de propriedades do controle.
Depois destes passos devemos criar no CodeBehind um membro do tipo Decimal chamado _valorTotal, que será responsável por armazenar a soma do valor de cada registro no evento RowDataBound. Abaixo o código do evento RowDataBound que ilustrará o processo de contabilização:
private decimal _valorTotal; ... protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) this._valorTotal += ((DbDataRecord)e.Row.DataItem).GetDecimal(0); else if (e.Row.RowType == DataControlRowType.Footer) e.Row.Cells[0].Text = "Total: " + this._valorTotal.ToString("C2"); } |
Analisando o código acima podemos ver que é utilizada uma condicional para verificar qual o tipo da linha/seção. Se ela for um tipo DataRow sabemos que é uma linha de exibição de dados normal e sendo assim, apenas atribuímos o valor para o membro _valorTotal. Agora se a linha for do tipo Footer devemos exibir a soma desta coluna para o usuário. Como nesse ponto já passamos por todos os registros da página corrente do GridView, nos resta apenas atribuir o valor do membro _valorTotal na seção Footer do GridView.
Para exibir o valor ao usuário definimos o membro _valorTotal à célula 0 (zero) da seção Footer do controle GridView. Para uma melhor visualização é interessante definir a propriedade HorizontalAlign para Right da coluna que deseja somar pois, assim, os valores ficam alinhados à direita, o que é padrão em valores numéricos.
Observação: O objeto GridViewRowEventArgs que vem como parâmetro no evento RowDataBound contém as informações completas da linha em questão, ou seja, como este evento é disparado a cada linha que é criada dentro do controle GridView, ele nos fornece informações como o tipo da linha, os valores provenientes da fonte de dados que serão exibidos, os controles filhos de cada linha, entre diversas outras propriedades.
A imagem abaixo exibe o controle GridView já com a coluna sumarizada e o valor desta soma sendo exibido na seção Footer do mesmo:
|
Figura 1 – GridView com a coluna sumarizada. |
Boa tarde Israel,
Gostaria de saber se tem uma maneira de fazer uma sumarização por categoria dentro de uma gridview e depois no final da grid fazer a sumarização total.
Exemplo:
Produto Categoria Quantidade Preço
101001 10 50 15,50
101302 10 100 15,89
100101 10 75 15,37
Sub/Total: 46,76
111011 11 8 8,89
113420 11 75 8,11
Sub/Total: 17,00
Total: 63,76
No aguardo.
Anderson
Boas Anderson,
Utilize o GridViewHelper: http://www.agrinei.com/gridviewhelper/gridviewhelper_pt.htm