Há casos onde necessitamos somar o valor de uma determinada coluna do DataGrid de uma aplicação ASP.NET, onde é exibido ao usuário um valor total/soma para conferência. Para isso, utilizaremos um DataGrid onde exibiremos o conteúdo de uma coluna da Base de Dados.
A solução para isso é utilizar o evento ItemDataBound do DataGrid, evento qual é disparado a cada novo item/registro que está sendo inserido pelo Bind do controle. Antes de mais nada, depois de criado o DataGrid em nosso WebForm, devemos exibir o Footer, marcando a propriedade "Show Footer" através do "Property Builder".
|
|
Na coluna que desejar "somar", deverá converte-la para "TemplateColumn" e com isso já conseguirá inserir um controle do tipo Label na seção FooterTemplate qual utilizaremos para atribuir o valor total da soma. O código da seção Footer deverá ficar semelhante ao código abaixo:
|
|
<FooterTemplate> |
<asp:Label id="lblValorTotal" runat="server" Font-Bold="True"></asp:Label> |
</FooterTemplate> |
|
|
Depois do design pronto, criamos um membro em nosso WebForm chamado "_total" qual usaremos para contabilizar o valor da coluna "Valor" da nossa tabela.
Como falamos acima, vamos efetuar a soma através do evento ItemDataBound do DataGrid, onde com isso vamos contabilizando nosso membro "_total". Temos que verificar qual o "tipo" da linha qual está sendo inserido o item/registro, pois nesse caso, teremos que prever dois tipos: Item Normal ou um Footer. Vejamos abaixo como ficará o evento ItemDataBound:
|
|
Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As _ |
System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound |
|
If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then |
Me._total += DirectCast(e.Item.DataItem, DbDataRecord).Item("Valor") |
ElseIf e.Item.ItemType = ListItemType.Footer Then |
DirectCast(e.Item.FindControl("lblValorTotal"), Label).Text = "Total: " & _ |
Me._total.ToString("C2") |
End If |
End Sub |
|
|
Analisando o código acima, podemos ver que utilizamos uma condicional para verificar qual o tipo da linha. Se ela for um tipo Item ou AlternatingItem, sabemos que é uma linha de exibição de dados normal e sendo assim, apenas atribuímos o valor para o nosso membro "_total". Agora se for a linha do tipo Footer, devemos exibir a soma para o usuário. Como nesse ponto já passamos por todos os registros da página corrente do DataGrid, nos resta atribuir o valor do nosso membro "_total" no controle Label que colocamos no Footer.
Convertemos o DataItem para um tipo DbDataRecord (como este passo não está no escopo deste artigo, não vamos abordá-lo. Mas como referência, fica este
post) para termos acesso a coluna "Valor" e assim contabilizar no membro "_total". A classe DbDataRecord está contida no Namespace System.Data.Common.
E por fim, através do DirectCast, recuperamos o Label "lblValorTotal" e atribuímos o valor do membro "_total".