当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET中为DataGrid添加合计字段

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 56 ::
收藏到网摘: n/a

论坛中最常见的一个问题是:“我怎样在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行的页脚进行着色。