在ASP.NET 2.0中操作数据:在GridView的页脚中显示统计信息
2010-02-21 20:16
866 查看
导言
除了需要了解产品的单价、库存量和订货量,并按等级排序之外,用户可能还对统计信息感兴趣,比如说平均价格、库存总量等等。这些统计信息常常显示在报表最下面的一个统计行中。GridView控件可以含有一个页脚行,我们可以通过编程将统计数据插入到它的单元格里面去。
这个任务给了我们以下3个挑战:
1. 配置GridView以显示它的页脚行
2. 确定统计数据。即我们应该如何计算平均价格还有库存总量?
3. 将统计信息插入到页脚行的相应的单元格中
在本节教程中,我们将会看到如何去征服这些挑战。另外呢,我们将创建一个页面,它含有一个列出所有“类别”的下拉框,选择一个“类别”就可以在GridView中显示这个类别的产品。GridView中包含一个页脚行,用于显示此类产品的平均价格、库存总量和订货总量。
<asp:GridView ID="ProductsInCategory" runat="server" AutoGenerateColumns="False"
2 DataKeyNames="ProductID" DataSourceID="ProductsInCategoryDataSource" EnableViewState="False">
3 <Columns>
4 <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />
5 <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price"
6 HtmlEncode="False" SortExpression="UnitPrice">
7 <ItemStyle HorizontalAlign="Right" />
8 </asp:BoundField>
9 <asp:BoundField DataField="UnitsInStock" HeaderText="Units In Stock" SortExpression="UnitsInStock">
10 <ItemStyle HorizontalAlign="Right" />
11 </asp:BoundField>
12 <asp:BoundField DataField="UnitsOnOrder" HeaderText="Units On Order" SortExpression="UnitsOnOrder">
13 <ItemStyle HorizontalAlign="Right" />
14 </asp:BoundField>
15 </Columns>
16</asp:GridView>
现在,我们就拥有了一个可以根据所选类别来显示相关的产品的名称、单价、库存量以及订货量的功能齐全的主/从报表了。
.FooterStyle
2<asp:GridView runat="server" CssClass="DataWebControlStyle">
2 <AlternatingRowStyle CssClass="AlternatingRowStyle" />
3 <RowStyle CssClass="RowStyle" />
4 <HeaderStyle CssClass="HeaderStyle" />
5 <FooterStyle CssClass="FooterStyle" />
6 <SelectedRowStyle CssClass="SelectedRowStyle" />
7</asp:GridView>
就像下面这个屏幕截图所显示的那样,这个更改使页脚清晰的显示出来了。
SELECT CategoryID, AVG(UnitPrice), SUM(UnitsInStock), SUM(UnitsOnOrder)
2FROM Products
3WHERE CategoryID = categoryID
4GROUP BY CategoryID
当然,你也可能不喜欢直接在SummaryDataInFooter.aspx页面中直接执行这个查询,而是希望在ProductsTableAdapter 和ProductsBLL 中创建一个方法来干这个事情。
2. 由于这些信息已经添加到GridView中了,所以可以直接计算——就像在“基于数据的自定义格式化”中讨论的那样,在GridView的数据绑定之后,GridView的RowDataBound事件处理方法会在添加每一行数据时被执行一次。为这个事件创建了事件处理方法之后,我们就可以保持一个累积的合计值了。在最后一行数据被绑定到DataGrid上之后,我们就有了一个合计值以及需要计算平均值的信息了。
一般来说,我还是喜欢第二种方法的,因为它节省了一次到数据库的往返,而且要达到这个效果还需要在数据访问层和业务逻辑层中实现统
计功能,不过话说回来了,其实两种办法都行的。在这本教程中,我们还是使用第二个办法吧,并使用RowDataBound事件处理方法来记录这
个累积合计。
给GridView新建一个RowDataBound事件处理方法,你可以在设计器中选择GridView,然后在属性窗口中点击那个带闪电符号的图标,
找到RowDataBound事件并双击它就可以了。这样就会在SummaryDataInFooter.aspx页面的后置代码类中添加一个新的名为
ProductsInCategory_RowDataBound的事件处理方法了。
1protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
2// 类范围,累积合计的变量……
2decimal _totalUnitPrice = 0m;
3int _totalNonNullUnitPriceCount = 0;
4int _totalUnitsInStock = 0;
5int _totalUnitsOnOrder = 0;
6
7protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
8protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
2protected 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 = "Avg.: " + avgUnitPrice.ToString("c");
14 e.Row.Cells[2].Text = "Total: " + _totalUnitsInStock.ToString();
15 e.Row.Cells[3].Text = "Total: " + _totalUnitsOnOrder.ToString();
16 }
17}
图十三展示了添加了这段代码之后这个报表的样子。注意ToString("c")是如何让平均价格这个统计信息格式化成货币形式的。
图十三:现在的效果(译者注:估计原文这里又弄错了,写得跟图十二的一样。这里的原文是“Figure 13: The GridView’s Footer Row Now Has a Reddish Background Color”,图十二的一样。这里的原文是“Figure 13: The GridView’s Footer Row Now Has a Reddish B的原文是“Figure 12: The GridView’s Footer Row Now Has a Reddish Background Color”)
总结
显示统计信息是一个常见的报表需求,而GridView控件可以在页脚行中包含这样的信息,而且它将这个操作变得非常简单。当GridView的
ShowFooter属性被设置为true时就可以显示页脚行了,并且通过RowDataBound事件处理方法可以将这些信息显示在它的不同的单元格中。
可以通过重新查询数据库的数据,也可以在ASP.NET页面的后置代码类中通过编程的方式来计算这些统计数据。
除了需要了解产品的单价、库存量和订货量,并按等级排序之外,用户可能还对统计信息感兴趣,比如说平均价格、库存总量等等。这些统计信息常常显示在报表最下面的一个统计行中。GridView控件可以含有一个页脚行,我们可以通过编程将统计数据插入到它的单元格里面去。
这个任务给了我们以下3个挑战:
1. 配置GridView以显示它的页脚行
2. 确定统计数据。即我们应该如何计算平均价格还有库存总量?
3. 将统计信息插入到页脚行的相应的单元格中
在本节教程中,我们将会看到如何去征服这些挑战。另外呢,我们将创建一个页面,它含有一个列出所有“类别”的下拉框,选择一个“类别”就可以在GridView中显示这个类别的产品。GridView中包含一个页脚行,用于显示此类产品的平均价格、库存总量和订货总量。
<asp:GridView ID="ProductsInCategory" runat="server" AutoGenerateColumns="False"
2 DataKeyNames="ProductID" DataSourceID="ProductsInCategoryDataSource" EnableViewState="False">
3 <Columns>
4 <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />
5 <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" HeaderText="Price"
6 HtmlEncode="False" SortExpression="UnitPrice">
7 <ItemStyle HorizontalAlign="Right" />
8 </asp:BoundField>
9 <asp:BoundField DataField="UnitsInStock" HeaderText="Units In Stock" SortExpression="UnitsInStock">
10 <ItemStyle HorizontalAlign="Right" />
11 </asp:BoundField>
12 <asp:BoundField DataField="UnitsOnOrder" HeaderText="Units On Order" SortExpression="UnitsOnOrder">
13 <ItemStyle HorizontalAlign="Right" />
14 </asp:BoundField>
15 </Columns>
16</asp:GridView>
现在,我们就拥有了一个可以根据所选类别来显示相关的产品的名称、单价、库存量以及订货量的功能齐全的主/从报表了。
.FooterStyle
2<asp:GridView runat="server" CssClass="DataWebControlStyle">
2 <AlternatingRowStyle CssClass="AlternatingRowStyle" />
3 <RowStyle CssClass="RowStyle" />
4 <HeaderStyle CssClass="HeaderStyle" />
5 <FooterStyle CssClass="FooterStyle" />
6 <SelectedRowStyle CssClass="SelectedRowStyle" />
7</asp:GridView>
就像下面这个屏幕截图所显示的那样,这个更改使页脚清晰的显示出来了。
SELECT CategoryID, AVG(UnitPrice), SUM(UnitsInStock), SUM(UnitsOnOrder)
2FROM Products
3WHERE CategoryID = categoryID
4GROUP BY CategoryID
当然,你也可能不喜欢直接在SummaryDataInFooter.aspx页面中直接执行这个查询,而是希望在ProductsTableAdapter 和ProductsBLL 中创建一个方法来干这个事情。
2. 由于这些信息已经添加到GridView中了,所以可以直接计算——就像在“基于数据的自定义格式化”中讨论的那样,在GridView的数据绑定之后,GridView的RowDataBound事件处理方法会在添加每一行数据时被执行一次。为这个事件创建了事件处理方法之后,我们就可以保持一个累积的合计值了。在最后一行数据被绑定到DataGrid上之后,我们就有了一个合计值以及需要计算平均值的信息了。
一般来说,我还是喜欢第二种方法的,因为它节省了一次到数据库的往返,而且要达到这个效果还需要在数据访问层和业务逻辑层中实现统
计功能,不过话说回来了,其实两种办法都行的。在这本教程中,我们还是使用第二个办法吧,并使用RowDataBound事件处理方法来记录这
个累积合计。
给GridView新建一个RowDataBound事件处理方法,你可以在设计器中选择GridView,然后在属性窗口中点击那个带闪电符号的图标,
找到RowDataBound事件并双击它就可以了。这样就会在SummaryDataInFooter.aspx页面的后置代码类中添加一个新的名为
ProductsInCategory_RowDataBound的事件处理方法了。
1protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
2// 类范围,累积合计的变量……
2decimal _totalUnitPrice = 0m;
3int _totalNonNullUnitPriceCount = 0;
4int _totalUnitsInStock = 0;
5int _totalUnitsOnOrder = 0;
6
7protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
8protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
2protected 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 = "Avg.: " + avgUnitPrice.ToString("c");
14 e.Row.Cells[2].Text = "Total: " + _totalUnitsInStock.ToString();
15 e.Row.Cells[3].Text = "Total: " + _totalUnitsOnOrder.ToString();
16 }
17}
图十三展示了添加了这段代码之后这个报表的样子。注意ToString("c")是如何让平均价格这个统计信息格式化成货币形式的。
图十三:现在的效果(译者注:估计原文这里又弄错了,写得跟图十二的一样。这里的原文是“Figure 13: The GridView’s Footer Row Now Has a Reddish Background Color”,图十二的一样。这里的原文是“Figure 13: The GridView’s Footer Row Now Has a Reddish B的原文是“Figure 12: The GridView’s Footer Row Now Has a Reddish Background Color”)
总结
显示统计信息是一个常见的报表需求,而GridView控件可以在页脚行中包含这样的信息,而且它将这个操作变得非常简单。当GridView的
ShowFooter属性被设置为true时就可以显示页脚行了,并且通过RowDataBound事件处理方法可以将这些信息显示在它的不同的单元格中。
可以通过重新查询数据库的数据,也可以在ASP.NET页面的后置代码类中通过编程的方式来计算这些统计数据。
相关文章推荐
- 在ASP.NET 2.0中操作数据之十五:在GridView的页脚中显示统计信息
- 在ASP.NET 2.0中操作数据之十五:在GridView的页脚中显示统计信息
- Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息
- 在ASP.NET 2.0中操作数据之五十一:从GridView的页脚插入新记录
- 在ASP.NET 2.0中操作数据之五十一:从GridView的页脚插入新记录
- 使用ASP.NET 2.0 GridView轻松操作数据
- Scott Mitchell 的ASP.NET 2.0数据教程之53:从GridView的页脚插入新记录
- 在ASP.NET 2.0中操作数据之十二:在GridView控件中使用TemplateField
- ASP.NET 2.0中用Gridview控件操作数据——使用Gridview插入新记录
- asp.net Gridview、Repeater 查无数据时显示表头及提示信息
- 在ASP.NET 2.0中操作数据之三十一:使用DataList来一行显示多条记录
- asp.net GridView列数据鼠标移入显示提示信息
- 在ASP.NET 2.0中操作数据之五十:为GridView控件添加Checkbox
- 在ASP.NET 2.0中操作数据:在GridView控件中使用TemplateField