虽然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属性以跨越多格。上例中,第一个单元格跨越了三列。