GridView中的汇总

      虽然GridView的主要目标是现实一组记录,但还可以加入一些有趣的信息,比如汇总数据。
      首先需要设置GridView.ShowFooter属性为真来加入脚注行。
      假如,假设你正在处理产品列表,一个简单的汇总行可以显示产品总价或均价。下面示例中,汇总行显示所有库存商品的总称。
      第一步是确定如何计算这个信息。如果正使用手工绑定,你可以在数据对象绑定到GridView之前读取它的值并进行计算。不过,如果你使用的是声明性绑定,就要借助其他技术了。有两个基本选项,在数据对象绑定到网格前获取数据,或者在绑定后从网格读取数据。下面示例使用后者,因为无论使用何种数据源你都可以重用相同的计算代码,如果启用了分页,它还能只计算当前页面显示的记录。这个方法的缺点是代码必须紧密绑定到GridView,因为你需要通过硬编码的序列号从中获取需要的信息。
      下面示例中,产品的分页网格提供表示当前显示产品的总价格的汇总(效果如下图所示)
      
        <asp:GridView ID="gridSummary" runat="server" AutoGenerateColumns="False" CellPadding="4"
            DataKeyNames
="ProductID" DataSourceID="sourceProducts" 
            Font-Names
="Verdana" Font-Size="Small" ForeColor="#333333" GridLines="None"
             AllowPaging
="True" OnDataBound="gridSummary_DataBound" ShowFooter="True">

      

      为了填充脚注,需要响应GridView.DataBound事件。这在GridView填充数据后立刻发生。在这之后就不能在访问数据远了,但可以遍历GridView的行和列的集合。计算总数之后,它被插入脚注行。
      完整代码如下:
      
    protected void gridSummary_DataBound(object sender, EventArgs e)
    {
        
decimal valueInStock = 0;


        
// The Rows collection only includes rows on the current page
        
// (not "virtual" rows).
        foreach (GridViewRow row in gridSummary.Rows)
        {
            
decimal price = Decimal.Parse(row.Cells[2].Text.Substring(1));
            
int unitsInStock = Int32.Parse(row.Cells[3].Text);
            valueInStock 
+= price * unitsInStock;
        }

        GridViewRow footer 
= gridSummary.FooterRow;
        
        
// Set the first cell to span over the entire row.
        footer.Cells[0].ColumnSpan = 3;
        footer.Cells[
0].HorizontalAlign = HorizontalAlign.Center;

        
// Remove the unneeded cells.
        footer.Cells.RemoveAt(2);
        footer.Cells.RemoveAt(
1);

        
// Add the text.
        footer.Cells[0].Text = "Total value in stock (on this page): " +
          valueInStock.ToString(
"C");

    }

      汇总行信息与网格的其他行拥有相同个数的列。所以如果希望跨越多个单元格显示文字,你需要配置适当的单元格的ColumSpan属性以跨越多格。上例中,第一个单元格跨越了三列。
posted @ 2009-10-07 15:24  i'm zjz  阅读(2137)  评论(0编辑  收藏  举报