Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
861
Assunto : ASP.NET
Titulo: Totalizando GridViews Paginadas

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



A forma mais simples de totalizar uma gridview é utilizando o evento RowDataBound para somar, linha a linha, o valor de um dos campos e ao final, no rodapé, exibir o total.

O problema desta técnica é que simplesmente não funciona quando a gridview está paginada. Isso porque o que é exibido é o total por página e não o total geral, sendo que a divisão de páginas normalmente não segue nenhum critério de negócio, fazendo com que o total por página não tenha importância alguma.

Uma possível solução para isso seria fazer uma nova query na base de dados para buscar o total geral e exibir no rodapé. Porém estariamos onerando a aplicação com mais uma ida a banco, quando na verdade já temos os dados em mãos.

Uma solução simples para isso envolve, sim, o uso do rowdatabound. Porém temos que fazer um acesso ao objeto DataTable que está por trás das linhas de dados e com esse acesso utilizar os recursos de cálculo do dataTable. Como o total é único, precisaremos fazer uma vez só e depois exibir no rodapé.

Veja como fica :

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound

If e.Row.RowType = DataControlRowType.DataRow Then
If Not calculado Then
total = DirectCast(e.Row.DataItem, Data.DataRowView).DataView.Table.Compute("sum(unitprice)", "")

calculado = True
End If
ElseIf e.Row.RowType = DataControlRowType.Footer Then
Dim lbl As Label
lbl = e.Row.FindControl("lbltotal")
lbl.Text = String.Format("{0:C}", total)
End If

End Sub

Para chegar até a dataTable, utilizamos o e.row.dataitem. Este elemento é do tipo datarowView, ou seja, uma linha de uma dataView, então a partir dele chegamos na dataview e por fim na dataTable, sobre a qual podemos utilizar o método Compute.

Se desejassemos algum tipo de filtragem especial, poderiamos aplicar como o 2o parâmetro do compute, mas nesse caso não foi necessário.


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 7/23/2011 3:04:00 AM
nome: Dennes
email: dennes@bufaloinfo.com.br
comentário:
Oi, Felipe,

Não, não tenho exemplo assim e a gridview não irá ajudar muito na construção disso, ficará por conta de eu próprio algorítimo.

Abs,

Dennes


data: 7/21/2011 4:45:00 PM
nome: Felipe
email: fwborges2@hotmail.com
comentário:
Dennes boa tarde! Você teria algum exemplo de um gridview que fosse somando seu rodapé de acordo com o avanço de suas páginas ?

Abraços


data: 6/12/2008 9:42:00 PM
nome: Dennes
email: dennes@bufaloinfo.com.br
comentário:

if (e.Row.RowType == DataControlRowType.DataRow)
{
if !calculado
{
total = ((System.Data.DataRowView)e.Row.DataItem).DataView.Table.Compute("sum(unitprice)", "");

calculado = true;
}
}
else if (e.Row.RowType == DataControlRowType.Footer)
{
Label lbl;
lbl = (Label)e.Row.FindControl("lbltotal");
lbl.Text = String.Format("{0:C}", total);
}


data: 6/5/2008 2:26:00 PM
nome: Ricardo Souza
email: ricardo.aparecido@comau.com.br
comentário:
Boa tarde, Gostei muito do Código de totalizar o Gridview, mas não consegui o aplicar em C#;

Poderia me envair o código convertido?

Desde ja agradeço a colaboração.


data: 6/5/2008 2:26:00 PM
nome: Ricardo.Souza
email: ricardo.aparecido@comau.com.br
comentário:
Boa tarde, Gostei muito do Código de totalizar o Gridview, mas não consegui o aplicar em C#;

Poderia me envair o código convertido?

Desde ja agradeço a colaboração.


 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br