ASP.NET中为DataGrid添加合计字段

论坛中最常见的一个问题是:“我怎样在DataGrid中显示列合计?”。我亲自多次为这个问题提供了示例代码,因此,我想在DotNetJunkies的标题中提供这么一份指南。在这份指南中你将会学到怎样在DataGrid中编程实现对某一列的值进行统计,并在DataGrid的页脚中显示其合计值。这份指南中供下载的示例中包括了C#和VisualBasic.NET两种代码。

这份指南的最终结果看起来像这样:


从上图可看出:

上面所用到的屏幕图片中的DataGrid是一个非常典型的DataGrid。有许多控制DataGrid外观的属性,它使用两个BoundColumns来操作数据,但这并不是最重要的。做好这项工作真正重要的是使用DataGrid.OnItemDataBound事件。这个事件将会触发每次绑定一条记录到DataGrid。你可以为这个事件创建一个事件处理,以操作数据记录。在这种情况下,你将会得到运行时Price列的合计值。

页脚指的是数据范围的最后一行。当这行被限定时,在事件句处理你可以得到Price列的运行时统计值。

实施

首先让我们找到一种方法来操作Web窗体输出。这份指南中,你将使用一个Web窗体(calcTotals.aspx)以及一个类代码文件(calcTotals.aspx.cs)。这份指南的意图是,类代码将会使用Just-In-Time编译器来编译。这里是calcTotals.aspx的代码:

<%@PageInherits="myApp.calcTotals"Src="20010731T0101.aspx.cs"%>


AutoGenerateColumns="False"
CellPadding="4"CellSpacing="0"
BorderStyle="Solid"BorderWidth="1"
Gridlines="None"BorderColor="Black"
ItemStyle-Font-Name="Verdana"
ItemStyle-Font-Size="9pt"
HeaderStyle-Font-Name="Verdana"
HeaderStyle-Font-Size="10pt"
HeaderStyle-Font-Bold="True"
HeaderStyle-ForeColor="White"
HeaderStyle-BackColor="Blue"
FooterStyle-Font-Name="Verdana"
FooterStyle-Font-Size="10pt"
FooterStyle-Font-Bold="True"
FooterStyle-ForeColor="White"
FooterStyle-BackColor="Blue"
OnItemDataBound="MyDataGrid_ItemDataBound"
ShowFooter="True">


ItemStyle-HorizontalAlign="Right"
HeaderStyle-HorizontalAlign="Center"/>


在Web窗体中你使用@Page来直接声明这个页所继承的类代码。SRC属性指明了类代码将使用JIT编译器来编译。Web窗体中的大部分代码样式声明用来使DataGrid外观变得更好看。

最后指定的属性之一是OnItemDataBound属性。这个事件将会在OnItemDataBound事件发生时被触发。

Web窗体中的DataGrid(MyGrid)包含有两个BoundColumns,一个是Title,另一个是Price。这里将显示Pubs数据库(SQLServer)中Titles表的title及price列。

忽略代码的定义

类代码在所有的地方都将使用。在类代码中,你可以操作两个事件:Page_Load事件以及MyGrid_OnItemDataBound事件。还有一个私有方法CalcTotal,用它来简单的完成运行时统计的数学运算。

类代码基本结构块的起始部分:

usingSystem;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.HtmlControls;
usingSystem.Data;
usingSystem.Data.SqlClient;

namespacemyApp
{
 publicclasscalcTotals:Page
 {
protectedDataGridMyGrid;
privatedoublerunningTotal=0;
 }
}
在类代码的基本结构中,你必须使用相关语句导入名字空间(namespace)。在类声明中,你声明了两个变量,一个是类代码中映射Web窗体的DataGrid(MyGrid)控件的变量;一个是用来操作DataGrid的Price列中运行时统计的双精度值。

Page_Load事件

在Page_Load事件中,你所要做的就是连接到SQLServer并执行一个简单的SqlCommand。你取得了所有Price值>0的title和price数据。你使用SqlCommand.ExecuteReader方法返回一个SqlDataReader并将其直接绑定到DataGrid(MyGrid)。

protectedvoidPage_Load(objectsender,EventArgse)
{
 SqlConnectionmyConnection=newSqlConnection("server=Localhost;database=pubs;uid=sa;pwd=;");//创建SQL连接
 SqlCommandmyCommand=newSqlCommand("SELECTtitle,priceFROMTitlesWHEREprice>0",myConnection);//创建SQL命令

 try
 {
myConnection.Open();//打开数据库连接
MyGrid.DataSource=myCommand.ExecuteReader();//指定DataGrid的数据源
MyGrid.DataBind();//绑定数据到DataGrid
myConnection.Close();//关闭数据连接
 }
 catch(Exceptionex)
 {
//捕获错误
HttpContext.Current.Response.Write(ex.ToString());
 }
}
CalcTotals方法

CalcTotals方法用来处理runningTotal变量。这个值将以字符串形式来传递。你需要将它解析为双精度型,然后runningTotal变量就成了双精度类型。

privatevoidCalcTotal(string_price)
{
 try
 {
runningTotal+=Double.Parse(_price);
 }
 catch
 {
//捕获错误
 }
}
   MyGrid_ItemDataBound事件

MyGrid_ItemDataBound事件在数据源中每行绑定到DataGrid时被调用。在这个事件处理中,你可以处理每一行数据。这里你的目的是,你将需要调用CalcTotals方法并从Price列传递文本,并用金额型格式化每一行的Price列,并在页脚行中显示runningTotal的值。

publicvoidMyDataGrid_ItemDataBound(objectsender,DataGridItemEventArgse)
{
 if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
 {
CalcTotal(e.Item.Cells[1].Text);
e.Item.Cells[1].Text=string.Format("{0:c}",Convert.ToDouble(e.Item.Cells[1].Text));
 }
 elseif(e.Item.ItemType==ListItemType.Footer)
 {
e.Item.Cells[0].Text="Total";
e.Item.Cells[1].Text=string.Format("{0:c}",runningTotal);
 }
}
在MyGrid_ItemDataBound事件句柄中,首先你得使用ListItemType判断当前的DataGridItem是一个数据项还是AlternatingItem行。如果是数据项,你调用CalcTotals,并将Price列的值作为参数传递给它;然后你以金额格式对Price列进行格式化及着色。

如果DataGridItem是页脚,可以用金额格式显示runningTotal。

总结

在这份指南中,你学到了怎样使用DataGrid.OnItemDataBound事件来实现运行时对DataGrid的某一列进行统计。使用这个事件,你可以创建一个列的合计并可对DataGrid行的页脚进行着色。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦庄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值