天天看点

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

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

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

从上图可看出:

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

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

<b>实施</b>:

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

&lt;?xml:namespaceprefix =asp /&gt;&lt;?xml:namespace prefix = asp /&gt;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"&gt;

="title"headertext="title"&gt;

itemstyle-horizontalalign="right"

headerstyle-horizontalalign="center"/&gt;

=mygrid

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

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

web窗体中的datagrid(mygrid)包含有两个boundcolumns,一个是title,另一个是price。这里将显示pubs数据库(sqlserver)中titles表的title及price列。

<b>忽略代码的定义</b>

类代码在所有的地方都将使用。在类代码中,你可以操作两个事件: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列中运行时统计的双精度值。

<b>page_load事件</b>

在page_load事件中,你所要做的就是连接到sqlserver并执行一个简单的sqlcommand。你取得了所有price值&gt;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&gt;0",myconnection);//创建sql命令

 try

myconnection.open();//打开数据库连接

mygrid.datasource=mycommand.executereader();//指定datagrid的数据源

mygrid.databind();//绑定数据到datagrid

myconnection.close();//关闭数据连接

 catch(exceptionex)

//捕获错误

httpcontext.current.response.write(ex.tostring());

<b>calctotals方法</b>

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

privatevoidcalctotal(string_price)

runningtotal+=double.parse(_price);

 catch

 <b> mygrid_itemdatabound事件</b>

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。

<b>总结</b>

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