k,类型为int
· _totalUnitsOnOrder,类型为int
然后,在RowDataBound事件处 理方法中写一些代码,使每一个数据行都可以增加这些变量的值。
1// 类范围,累积合计的变量……
2decimal _totalUnitPrice = 0m;
3int _totalNonNullUnitPriceCount = 0;
4int _totalUnitsInStock = 0;
5int _totalUnitsOnOrder = 0;
6
7protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
8{
9 if (e.Row.RowType == DataControlRowType.DataRow)
10 {
11 // 通过 e.Row.DataItem 属性引用ProductsRow
12 Northwind.ProductsRow product = (Northwind.ProductsRow)((System.Data.DataRowView) e.Row.DataItem).Row;
13
14 // 增加累积合计(如果它们不 为NULL的话!)
15 if (!product.IsUnitPriceNull())
16 {
17 _totalUnitPrice += product.UnitPrice;
18 _totalNonNullUnitPriceCount++;
19 }
20
21 if (!product.IsUnitsInStockNull())
22 _totalUnitsInStock += product.UnitsInStock;
23
24 if (!product.IsUnitsOnOrderNull())
25 _totalUnitsOnOrder += product.UnitsOnOrder;
26 }
27}
在RowDataBound事件处理方法中,我们首先应该确保我们正在操 作一个DataRow。一旦确定了是这么回事,e.Row中那个刚刚绑定到GridViewRow对 象的Northwind.ProductsRow实例就可以赋值给product变量了。接着,累积合计 就被当前产品的相关值(当然了,我们还是应该要确保它们不会含有一个数据库 NULL值)增加了。我们同时记录了累积的UnitPrice合计以及非空UnitPrice记录 的条数,因为平均价格是这两个数的商。
第四步:在页脚中显示统计数据
计算了统计数据之后,最后一个步骤就是在GridView的页脚上显示它了。 同样,这个任务也可以通过RowDataBound事件处理方法来完成。回忆一下 RowDataBound事件处理方法,它会在每一行绑定到GridView的时候被触发,页脚 行也不例外。因此,我们可以扩展我们的事件处理方法,让它可以通过如下的代 码来在页脚行中显示数据:
1protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
2{
3 if (e.Row.RowType == DataControlRowType.DataRow)
4 {
5 //……增加累积合计……
6 }
7 else if (e.Row.RowType == DataControlRowType.Footer)
8 {
9 //……在 页脚中显示统计数据……
10 }
11}
因为页脚行是在所有的数据行都已经添加之后才添加到GridView中的,所以我们 可以相信在将统计数据显示在页脚中之前,累积合计值都已经计算完毕了。最后 一步就是将这些值放到页脚的单元格中了。
要在页脚的特定单元格中显示 文本,可以使用use e.Row.Cells[index].Text = value,单元格的索引是从0开 始的。下面的代码计算了平均价格(总的价格除以产品的数量)并将其与库存量 和订货量一起显示到GridView页脚的相应单元格中。
1protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
2{
3 if (e.Row.RowType == DataControlRowType.DataRow)
4 {
5 //…… 增加累积合计……
6 }
7 else if (e.Row.RowType == DataControlRowType.Footer)
8 {
9 // 确定平均单价
10 decimal avgUnitPrice = _totalUnitPrice / (decimal) _totalNonNullUnitPriceCount;
11
12 // 在相应的 单元格中显示统计数据
13 e.Row.Cells[1].Text = "
|