首页 > 编程 > .NET > 正文

ASP.NET数据格中计算数值总和

2024-07-10 12:57:34
字体:
来源:转载
供稿:网友
以表格形式显示数据可以带来很多好处。在本文中,我将讲解如何使用datagrid计算总计,这在处理数值时会经常用到。



在讨论datagrid控制时,常常可以听到别人对此方法的嘲笑。他们常常抛弃它转而使用第三方的工具。事实上,datagrid作为. net framework的核心部分,已成为我开发工具箱中极具价值的工具。

什么是总计?
在应用程序中使用datagrid控制可以允许你以对绝大部分用户来说熟悉的格式来发布数据(栅格格式常常被用于如微软excel等电子数据表格应用程序)。使用此类型的应用程序,用户可以按照习惯查看自定义函数如每栏总计、平均值等。而这些函数并不是datagrid的标准函数,你可以自行编写代码来轻松地实现这些函数。

在本例中,我将使用所有sql server版本都可提供的northwind范例数据库,并从顺序表格中提取数据。我将对货物栏计算总计值,这个总计值应当在datagrid中一致地显示出来。一下就是此应用程序的c#代码。

<%@ import namespace="system.data.sqlclient" %>

<%@ import namespace="system.data" %>

<%@ page language="c#" %>

<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >

<html><head><title>builder.com datagrid totals example</title>

</head>

<body ms_positioning="gridlayout">

double totalfreight = 0;

private void page_load(object sender, system.eventargs e) {

if (!page.ispostback) {

binddata();

} }

private void binddata() {

const string sconn;

sconn = "server=(local);initial catalog=northwind;uid=ctester;pwd=password";

try {

sqlconnection conn = new sqlconnection(sconn);

conn.open();

string ssql = "select top 10 orderid, freight, shipname, shipcountry from

orders";

sqlcommand comm = new sqlcommand(ssql, conn);

sqldatareader dr = comm.executereader();

dgnorthwind.datasource = dr;

dgnorthwind.databind();

} catch (exception e) {

console.writeline(e.tostring());

} }

private void dototal(object sender, datagriditemeventargs e) {

if (e.item.itemtype == listitemtype.item | e.item.itemtype ==

listitemtype.alternatingitem) {

double currentfreight = convert.todouble(databinder._eval(e.item.dataitem,

"freight"));

totalfreight += currentfreight;

} else if (e.item.itemtype == listitemtype.footer) {

e.item.cells[2].text = "total:";

e.item.cells[3].text = convert.tostring(totalfreight);

} }

</script>

<form id="frmdatagridtotals" method="post" runat="server">

<asp:datagrid id="dgnorthwind"

style="z-index: 101; left: 24px; position: absolute; top: 32px"

runat="server" height="320px" width="496px"

autogeneratecolumns="false"

onfiltered="dototal"

showfooter="true" 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="gray"

footerstyle-font-name="verdana"

footerstyle-font-size="10pt"

footerstyle-font-bold="true"

footerstyle-forecolor="red"

footerstyle-backcolor="gray">

<columns>

<asp:boundcolumn datafield="orderid" headertext="#" itemstyle-width="10%"

headerstyle-horizontalalign="center" />

<asp:boundcolumn datafield="shipname" headertext="customer" itemstyle

-width="50%" />

<asp:boundcolumn datafield="shipcountry" headertext="country" itemstyle

-width="20%" />

<asp:boundcolumn datafield="freight" headertext="freight" itemstyle-width="20%"

/>

</columns></asp:datagrid>

</form></body></html>


或许首先你注意到的是此页面没有使用code-behind特性。所有的代码都放在aspx文件中。页面首部必需的import指令保证了数据交互所需代码的可用性。页面事件page_load调用了binddata方法,这正是与数据库交互的地方。它连接到数据库并创建sqldatareader对象,此对象包含了由sql语句返回的记录。对象sqldatareader通过对象datagrid的datasource属性把datagrid对象放入页面中。对象datagrid的databind方法负责装入数据。datagrid的html定义了栏目及其格式,包括颜色、字体、对齐等。



databind方法还保持着对来自数据源的数据栏的动态求和。以下代码返回一行数据的详细个数:

double currentfreight = convert.todouble(databinder._eval(e.item.dataitem,

"freight"));

此行代码返回由_eval语句获得的值,并将其转换为保持动态求和所必需的格式。一旦返回了此值,它将被加到total变量中。在datagrid中的每行都将进行此操作。以下代码定义了一行:

if(e.item.itemtype==listitemtype.item |

e.item.itemtype==listitemtype.alternatingitem)

此语句对于datagrid中的每行都返回true。语句的其他部分决定了何时显示总计数量。当所有的行(if语句的第一部分为false)都被处理时该语句被执行,除非以以下语句开头:

else if (e.item.itemtype == listitemtype.footer)

当到达页脚时,此语句将返回true。既然我们对页眉没有兴趣,我们必须确定这是否是页脚。在这种情况下,总计值将显示在datagrid合适的栏中。必须记住栏的编号是从0开始。由此,我们得出栏2和栏3,而不是栏3和栏4。你可以通过用item的索引值来覆盖cells属性中的text属性来完成此工作。

e.item.cells[2].text = "total:";

e.item.cells[3].text = convert.tostring(totalfreight);

需要注意总计值在显示前被转换为字符串值。

另一种方法
当并不急需获得数据的总计值时,你可以使用另外一种方法。此方法通过sql sum命令来计算栏中数值的总数。这种方法的缺点在于它需要一个单独的数据库调用,并且结果必须存放在dataset或其他类似的对象中。

翻页
你或许想知道datagrid 翻页是如何影响到总计值的。本文中的范例代码将显示对屏幕所示的数据的求和,所以对每页来说结果都会不同(你必须调整代码以保持对每个变量的求和,但这已经超出了本文所讨论的范围)。

由于你不能使用sqldatareader来翻页,本文的代码将不能用于翻页的情况。但你可以将代码修改为使用dataset对象以利用其提供的翻页选项。以下代码改变将完成此工作:

sqlcommand comm = new sqlcommand(ssql, conn);

sqldataadapter da = new sqldataadapter();

da.selectcommand = comm;

dataset ds = new dataset();

da.fill(ds);

dgnorthwind.datasource = ds;


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表