ASP.NET DataGrid控件数据分组操作

开发 后端
本文介绍如何使用ASP.NET DataGrid控件进行数据分组操作。

ASP.NET DataGrid控件数据分组操作

下面的 SQL 命令选择所有客户在给定年份发出的所有定单。只显示每个定单所有项目价格的总和。

SELECT o.customerid, od.orderid, SUM(od.quantity*od.unitprice) AS price   
FROM Orders o, [Order Details] od  
WHERE Year(o.orderdate) = @TheYear AND od.orderid=o.orderid  
GROUP BY o.customerid, od.orderid  
ORDER BY o.customerid 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

在 T-SQL 语言中,SELECT 语句的 GROUP BY 子句提供将预定义的汇总行添加到结果集的 WITH ROLLUP 子句。当然,这样的汇总行具有所有其他列的布局,但每一列的内容都可以进行某种程度的自定义。下面的语句阐释如何修改上面的命令,以使其允许使用汇总行。

DECLARE @TheYear int 
SET @TheYear = 1998  
 
SELECT   
    CASE GROUPING(o.customerid) WHEN 0   
THEN o.customerid ELSE '(Total)' END AS MyCustomerID,   
    CASE GROUPING(od.orderid) WHEN 0   
THEN od.orderid ELSE -1 END AS MyOrderID,   
    SUM(od.quantity*od.unitprice) AS price  
FROM Orders o, [Order Details] od  
WHERE Year(orderdate) = @TheYear AND od.orderid=o.orderid  
GROUP BY o.customerid, od.orderid WITH ROLLUP 
ORDER BY o.customerid, price  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

如果您将该代码片段复制并粘贴到 SQL 查询分析器中,将看到如下图所示的内容。

WITH ROLLUP 子句将汇总行添加到结果集

ASP.NET DataGrid控件: WITH ROLLUP 子句将汇总行添加到结果集

GROUPING 是一种 T-SQL 聚合函数,它与 ROLLUP 一起工作于 GROUP BY 子句的主体中。使用 GROUPING 运算符将使新列添加到结果集。如果该行已经由 ROLLUP 运算符添加并因此而成为汇总行,则新列中将包含值 1。否则,该列将包含值 0。使用 CASE..WHEN..END 语句可以将这个新列与分组列合并在一起。

在上面的示例中,MyCustomerID 列在所有因其进行分组而创建的行中包含 CustomerID 列的值以及字符串 “(Total)”。同样,当该行代表小计时,MyOrderID 列包含定单 ID 和 –1。

为了对数据进行汇总,SQL Server 还提供了几个选项,例如,WITH CUBE 运算符和 COMPUTE BY 子句。正如您所想象的那样,尽管一个选项的功能以某种方式与另一个选项的功能相交叉,但是所有这些选项并不完全等价。特别是,WITH CUBE 针对结果集内组与子组的每个可能的组合都生成一个汇总行。而 WITH ROLLUP 按照分组列的指定顺序来进行分组。最后,COMPUTE BY(SQL Server 2000 支持它的目的仅在于获得向后兼容性)的工作方式与 WITH ROLLUP 大体相同,不同的是它返回多个结果集,而且在由查询优化器处理时不如 ROLLUP 效率高。

ASP.NET DataGrid控件:显示已分组数据

当绑定到 DataGrid 控件时,由 SQL 命令返回的结果集看上去如下图所示。

通过 DataGrid 控件显示的结果集

ASP.NET DataGrid控件: 通过 DataGrid 控件显示的结果集

示例应用程序中使用的 DataGrid 控件按如下方式进行声明:

< asp:DataGrid id="grid" runat="server"   
AutoGenerateColumns="false" 
AllowPaging="true" PageSize="15" 
Font-Size="xx-small" 
CellSpacing="0" CellPadding="4" GridLines="both" 
BorderStyle="solid" BorderColor="skyblue" BorderWidth="1"   
OnItemCreated="ItemCreated" 
OnPageIndexChanged="PageIndexChanged"> 
 
< headerstyle backcolor="skyblue" font-size="9pt" font-bold="true" /> 
< itemstyle backcolor="#eeeeee" /> 
< pagerstyle backcolor="skyblue" font-name="webdings"   
font-size="10pt" PrevPageText="3" NextPageText="4" /> 
 
< Columns> 
< asp:BoundColumn DataField="MyCustId" HeaderText="Customer" /> 
< asp:BoundColumn DataField="MyOrderId" HeaderText="Order #" /> 
< asp:BoundColumn DataField="price" HeaderText="Amount"   
DataFormatString="{0:c}"> 
< itemstyle horizontalalign="right" /> 
< /asp:BoundColumn> 
< /Columns> 
< /asp:DataGrid> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

使用 WITH ROLLUP 运算符获取的数据源已经包含生成有效的报告所必需的全部信息。您可能已经注意到了,该语句添加一个顶行,其中包含由所有客户发出的全部定单的合计。在使用 WITH ROLLUP 运算符时,如果您修改了分组行的顺序,则所生成行的数量和结构可能会发生显著变化。这额外的一行是我选择使用特定语法的结果。如果您不需要这段信息,只需在绑定之前将它从结果集删除。或者,可以将该行移到数据集的底部。

下面显示的代码阐释如何执行 rollup 语句。从文本框中读出的参数是要考虑的年份。结果集临时存储在 DataSet 对象中。在这个示例应用程序中,我将在 Session 槽中缓存 DataSet 对象。在实际环境中,这应该是受重视的选择。通常,存储在 Session 中的任何字节都有一个位于那里的充分理由。

private DataSet PhysicalDataRead()  
{  
String strCnn = "SERVER=localhost;DATABASE=northwind;UID=sa;";  
SqlConnection conn = new SqlConnection(strCnn);  
 
// Command text using WITH ROLLUP  
StringBuilder sb = new StringBuilder("");  
sb.Append("SELECT ");  
sb.Append("  CASE GROUPING(o.customerid) WHEN 0 ");  
sb.Append("    THEN o.customerid ELSE '(Total)' END AS MyCustID, ");  
sb.Append("  CASE GROUPING(od.orderid) WHEN 0 ");  
sb.Append("    THEN od.orderid ELSE -1 END AS MyOrderID, ");  
sb.Append("  SUM(od.quantity*od.unitprice) AS price ");  
sb.Append("FROM Orders o, [Order Details] od ");  
sb.Append("WHERE Year(orderdate)=@nYear AND od.orderid=o.orderid ");  
sb.Append("GROUP BY o.customerid, od.orderid WITH ROLLUP ");  
sb.Append("ORDER BY o.customerid, price");  
String strCmd = sb.ToString();  
sb = null;  
 
SqlCommand cmd = new SqlCommand();  
cmd.CommandText = strCmd;  
cmd.Connection = conn;     
SqlDataAdapter da = new SqlDataAdapter(strCmd, strConn);  
da.SelectCommand = cmd;  
 
// Set the "year" parameter  
SqlParameter p1 = new SqlParameter("@nYear", SqlDbType.Int);  
p1.Direction = ParameterDirection.Input;  
p1.Value = Convert.ToInt32(txtYear.Text);  
cmd.Parameters.Add(p1);  
 
DataSet ds = new DataSet();  
da.Fill(ds, "Orders");  
return ds;  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

为了使汇总行在该网格的页面中清楚地显示,需要更改汇总行的样式和布局。这可在 ItemCreated 事件处理程序中完成。设计思路是,通过检查定单 ID 来检测汇总行,然后修改单元格的布局和样式。在结果集内,汇总行的特征是定单 ID 为 –1。值 –1 是来自所使用语句的任意值。

CASE GROUPING(od.orderid) WHEN 0 THEN od.orderid ELSE -1 END AS MyOrderID  
  • 1.

如果不针对 orderid 列使用 GROUPING 运算符,则对于汇总行来说,该列的值将为 NULL。

以上就总结了如何使用ASP.NET DataGrid控件进行数据分组操作。

【编辑推荐】

  1. 什么是ASP.NET DataGrid控件:完全模板化的网格
  2. ASP.NET的GridView与DataGrid控件比较浅析
  3. .NET新手指南:轻松自定义DataGridView控件
  4. C#中对DatagridView的部分常用操作
  5. ASP.net中将DataGrid的内容导出为excel文件
责任编辑:yangsai 来源: MSDN
相关推荐

2009-07-15 18:25:52

ASP.NET控件数组

2009-08-03 18:29:31

GridView与Da

2009-08-07 17:31:26

ASP.NET Dat

2009-08-07 17:56:07

DataGrid的样式

2009-08-04 15:20:59

ASP.NET数据验证数据验证控件

2009-07-24 17:15:52

SiteMapData

2009-08-07 15:34:15

ASP.NET数据绑定

2009-08-05 15:57:03

ASP.NET控件ID

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-08-19 13:44:00

ASP.NET Lis

2009-08-04 10:43:59

ASP.NET控件开发

2009-07-27 17:25:53

ASP.NET验证控件

2009-08-17 09:24:25

ASP.NET控件

2009-07-27 16:19:59

ASP.NET报表控件

2009-07-27 13:52:36

Panel控件ASP.NET

2009-08-03 15:08:00

SqlDataSour

2009-08-03 18:15:05

ASP.NET数据绑定

2009-08-07 17:41:07

ASP.NET Web

2009-11-26 09:02:59

ASP.NET数据控件

2009-07-28 14:22:05

数据源控件ASP.NET
点赞
收藏

51CTO技术栈公众号