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的代码:
<?XML:NAMESPACEPREFIX =ASP /><?XML:NAMESPACE PREFIX = ASP />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">
="TITLE"HEADERTEXT="TITLE">
ItemStyle-HorizontalAlign="Right"
HeaderStyle-HorizontalAlign="Center"/>
=MYGRID
在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行的页脚进行着色。
最后更新:2017-04-02 00:06:36
上一篇:
ASP.NET Web Page应用深入探讨
下一篇:
使用游戏引擎实现的水波纹
Adobe鲜为人知的身份:全球第二大云端服务商
国内首套免费的《Nutch相关框架视频教程》(1-16)
c语言基础(六)之类型
React全家桶与前端单元测试艺术
移动测试-金融行业解决方案
eclipse如何导入javax.servlet.*
Java常用类库--StringBuffer:append、insert、reverse、replace、subString、delete、indexOf
Linux Eclipse代码提示功能设置(Java & C/C++)
Struts中<s:checkboxlist>的用法
【图文】云栖大会深圳峰会:阿里云ET医疗大脑与工业大脑,机器学习平台PAI2.0