Adicionar campo total ao DataGrid no ASP.NET
Autor:Eve Cole
Data da Última Atualização:2009-06-30 15:40:15
Uma das perguntas mais frequentes no fórum é: "Como faço para exibir os totais das colunas em um DataGrid?". Eu pessoalmente forneci código de exemplo para esta pergunta muitas vezes, então gostaria de fornecer esse guia no título DotNetJunkies. Neste guia você aprenderá como contar programaticamente os valores de uma coluna no DataGrid e exibir o valor total no rodapé do DataGrid. Os exemplos para download neste guia incluem código C# e Visual Basic.NET.
O resultado final deste guia será assim:
Como pode ser visto na imagem acima:
O DataGrid na imagem da tela usada acima é um DataGrid muito típico. Existem muitas propriedades que controlam a aparência do DataGrid, que usa duas BoundColumns para manipular dados, mas isso não é o mais importante. O que é realmente importante para fazer isso bem é usar o evento DataGrid.OnItemDataBound. Este evento será acionado sempre que um registro for vinculado ao DataGrid. Você pode criar um manipulador de eventos para este evento para manipular o registro de dados. Neste caso, você obterá o valor total da coluna Preço em tempo de execução.
O rodapé refere-se à última linha do intervalo de dados. Quando esta linha for qualificada, será possível obter as estatísticas de tempo de execução da coluna Preço durante o processamento do evento.
Implementação :
Primeiro, vamos encontrar uma maneira de manipular a saída de Web Forms. Neste tutorial, você usará um formulário Web (calcTotals.aspx) e um arquivo de código de classe (calcTotals.aspx.cs). A intenção deste guia é que o código da classe seja compilado usando um compilador Just-In-Time. Aqui está o código para calcTotals.aspx:
<%@ Page Inherits="myApp.calcTotals" Src="20010731T0101.aspx.cs" %>
|
AutoGenerateColumns="Falso" CellPadding = "4" CellSpacing = "0" BorderStyle="Sólido" BorderWidth="1" Gridlines="Nenhum" BorderColor="Preto" ItemStyle-Font-Name="Verdana" ItemStyle-Font-Size="9pt" HeaderStyle-Font-Name="Verdana" HeaderStyle-Font-Size="10pt" HeaderStyle-Font-Bold = "Verdadeiro" HeaderStyle-ForeColor = "Branco" HeaderStyle-BackColor = "Azul" FooterStyle-Font-Name="Verdana" FooterStyle-Font-Size="10pt" FooterStyle-Font-Bold = "Verdadeiro" FooterStyle-ForeColor = "Branco" FooterStyle-BackColor = "Azul" OnItemDataBound="MyDataGrid_ItemDataBound" ShowFooter="Verdadeiro">
|
ItemStyle-HorizontalAlign = "Direito" HeaderStyle-HorizontalAlign="Center" />
|
Em Web Forms você usa @Page para declarar diretamente o código da classe que a página herda. O atributo SRC indica que o código da classe será compilado usando o compilador JIT. A maioria das declarações de estilo de código em Web Forms são usadas para melhorar a aparência do DataGrid.
Uma das últimas propriedades especificadas é a propriedade OnItemDataBound. Este evento será acionado quando ocorrer o evento OnItemDataBound.
O DataGrid (MyGrid) no Web Form contém duas BoundColumns, uma é Título e a outra é Preço. As colunas de título e preço da tabela Títulos no banco de dados Pubs (SQL Server) serão exibidas aqui.
Ignorar definições de código
O código da classe será usado em todos os lugares. No código da classe, você pode operar dois eventos: evento Page_Load e evento MyGrid_OnItemDataBound. Existe também um método privado CalcTotal, que pode ser usado para simplesmente realizar operações matemáticas em estatísticas de tempo de execução.
O início do bloco estrutural básico do código da classe:
usando o sistema; usando System.Web; usando System.Web.UI; usando System.Web.UI.WebControls; usando System.Web.UI.HtmlControls; usando System.Data; usando System.Data.SqlClient;
namespace meuApp { classe pública calcTotals: Página { DataGrid MyGrid protegido; privado duplo runningTotal = 0; } } |
Na estrutura básica do código da classe, você deve usar as instruções relevantes para importar o namespace (namespace). Na declaração da classe, você declara duas variáveis, uma é a variável que mapeia o controle DataGrid (MyGrid) do formulário Web no código da classe e a outra é o valor de precisão dupla usado para operar as estatísticas de tempo de execução na coluna Preço do DataGrid; .
Evento Page_Load
No evento Page_Load, tudo o que você precisa fazer é conectar-se ao SQL Server e executar um SqlCommand simples. Você obteve todos os dados de título e preço com Valor de preço > 0. Você usa o método SqlCommand.ExecuteReader para retornar um SqlDataReader e vinculá-lo diretamente ao DataGrid (MyGrid).
protegido void Page_Load (remetente do objeto, EventArgs e) { SqlConnection myConnection = new SqlConnection("server=Localhost;database=pubs;uid=sa;pwd=;");//Criar conexão SQL SqlCommand myCommand = new SqlCommand("SELECT title, price FROM Titles WHERE price > 0", myConnection ); //cria comando SQL
tentar { myConnection.Open();//Abre a conexão com o banco de dados MyGrid.DataSource = myCommand.ExecuteReader();//Especifica a fonte de dados do DataGrid MyGrid.DataBind();//Vincula dados ao DataGrid myConnection.Close();//Fecha a conexão de dados} catch(Exceção ex) { //Captura o erro HttpContext.Current.Response.Write(ex.ToString()); } } |
Método CalcTotals
O método CalcTotals é usado para lidar com a variável runningTotal. Este valor será passado como uma string. Você precisa analisá-lo como um duplo e então a variável runningTotal se torna um duplo.
privado vazio CalcTotal(string _preço) { tentar { runningTotal += Double.Parse(_price); } pegar { //captura erro} } |
Evento MyGrid_ItemDataBound
O evento MyGrid_ItemDataBound é chamado quando cada linha na fonte de dados está vinculada ao DataGrid. Neste manipulador de eventos, você pode processar cada linha de dados. Para seus propósitos aqui, você precisará chamar o método CalcTotals e passar o texto da coluna Preço e formatar a coluna Preço de cada linha com um valor e exibir o valor runningTotal na linha de rodapé.
public void MyDataGrid_ItemDataBound(remetente do objeto, DataGridItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { CalcTotal(e.Item.Cells[1].Texto); e.Item.Cells[1].Text = string.Format("{0:c}", Convert.ToDouble(e.Item.Cells[1].Text)); } senão if(e.Item.ItemType == ListItemType.Footer ) { e.Item.Cells[0].Text="Total"; e.Item.Cells[1].Text = string.Format("{0:c}", runningTotal); } } |
No manipulador de eventos MyGrid_ItemDataBound, primeiro você deve usar ListItemType para determinar se o DataGridItem atual é um item de dados ou uma linha AlternatingItem. Para itens de dados, você chama CalcTotals e passa o valor da coluna Preço como parâmetro; em seguida, formata e colore a coluna Preço no formato de valor.
Se DataGridItem for um rodapé, runningTotal poderá ser exibido no formato de valor.
Resumir
Neste guia, você aprendeu como usar o evento DataGrid.OnItemDataBound para executar estatísticas de tempo de execução em uma coluna DataGrid. Usando este evento, você pode criar um total de coluna e colorir o rodapé de uma linha do DataGrid.