GridView中的汇总
虽然GridView的主要目标是现实一组记录,但还可以加入一些有趣的信息,比如汇总数据。
首先需要设置GridView.ShowFooter属性为真来加入脚注行。
假如,假设你正在处理产品列表,一个简单的汇总行可以显示产品总价或均价。下面示例中,汇总行显示所有库存商品的总称。
第一步是确定如何计算这个信息。如果正使用手工绑定,你可以在数据对象绑定到GridView之前读取它的值并进行计算。不过,如果你使用的是声明性绑定,就要借助其他技术了。有两个基本选项,在数据对象绑定到网格前获取数据,或者在绑定后从网格读取数据。下面示例使用后者,因为无论使用何种数据源你都可以重用相同的计算代码,如果启用了分页,它还能只计算当前页面显示的记录。这个方法的缺点是代码必须紧密绑定到GridView,因为你需要通过硬编码的序列号从中获取需要的信息。
下面示例中,产品的分页网格提供表示当前显示产品的总价格的汇总(效果如下图所示)
为了填充脚注,需要响应GridView.DataBound事件。这在GridView填充数据后立刻发生。在这之后就不能在访问数据远了,但可以遍历GridView的行和列的集合。计算总数之后,它被插入脚注行。
完整代码如下:
汇总行信息与网格的其他行拥有相同个数的列。所以如果希望跨越多个单元格显示文字,你需要配置适当的单元格的ColumSpan属性以跨越多格。上例中,第一个单元格跨越了三列。
首先需要设置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">
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");
}
{
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属性以跨越多格。上例中,第一个单元格跨越了三列。