打印

[asp.net教程] asp.net数据格中计算数值总和

asp.net数据格中计算数值总和

以表格形式显示数据可以带来很多好处。在本文中,我将讲解如何使用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;

TOP

返回顶部
AYBlue

Processed in 0.060720 second(s), 7 queries.

当前时区 GMT+8, 现在时间是 2009-1-10 10:48 京ICP备06054220号

清除 Cookies - 联系我们 - 163K.com - Archiver - WAP