亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Scott Mitchell 的ASP.NET 2.0數據教程之十五:

系統 2108 0

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

導言


除了需要了解產品的單價、庫存量和訂貨量,并按等級排序之外,用戶可能還對統計信息感興趣,比如說平均價格、庫存總量等等。這些統計信息常常顯示在報表最下面的一個統計行中。GridView控件可以含有一個頁腳行,我們可以通過編程將統計數據插入到它的單元格里面去。這個任務給了我們以下3個挑戰:

1. 配置GridView以顯示它的頁腳行

2.確定統計數據。即我們應該如何計算平均價格還有庫存總量?

3.將統計信息插入到頁腳行的相應的單元格中


在本節教程中,我們將會看到如何去征服這些挑戰。另外呢,我們將創建一個頁面,它含有一個列出所有“類別”的下拉框,選擇一個“類別”就可以在GridView中顯示這個類別的產品。GridView中包含一個頁腳行,用于顯示此類產品的平均價格、庫存總量和訂貨總量。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息
圖一:統計信息顯示在GridView的頁腳行中

由于含有“類別”到“產品”的主/從界面,所有本節是建立在前面的“使用DropDownList進行主/從過濾”節中所討論的那些概念的基礎上的。如果你還沒有看過那一節的話,在繼續本節的學習之前,還是去看看比較好。

第一節:添加“類別”下拉框和“產品”GridView

往GridView中添加頁腳行之前,讓我們先來簡單的建立一個主/從報表。一旦我們完成了這第一步的工作,我們就可以來看看如何加入統計數據了。

首先打開CustomFormatting文件夾中的SummaryDataInFooter.aspx頁面。添加一個DropDownList控件,并將其ID設置為Categories。然后,在這個DropDownList的智能標簽上點擊“選擇數據源(Choose Data Source)”,添加一個新的調用CategoriesBLL類的GetCategories ()方法的ObjectDataSource控件,將這個ObjectDataSource命名為CategoriesDataSource。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息
圖二:添加一個新的名為CategoriesDataSource的ObjectDataSource控件

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息
圖三:使這個ObjectDataSource控件調用CategoriesBLL類的GetCategories ()方法


再配置了了ObjectDataSource之后,向導會將我們返回到DropDownList的數據源配置向導那里,在這兒我們可以指定哪個字段需要顯示以及哪個字段應該作為DropDownList的ListItem的值。我們將CategoryName字段拿來顯示,而把CategoryID拿來作為值。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息
圖四:分別使用CategoryName和CategoryID來作為ListItem的文本和值


現在,我們便在系統中有了一個能列出類別的DropDownList了。現在我們需要添加一個根據所選的類別來列出產品的GridView。不過,在此之前,讓我們先花點時間到DropDownList的智能標簽中勾上“啟用自動回發(Enable AutoPostBack)”復選框。我們在前面的“使用DropDownList進行主/從過濾 lidong6”節中討論過,在將DropDownList的AutoPostBack屬性設置為true之后,只要DropDownList的值發生了變化,頁面就會回發。這樣就可以刷新GridView以顯示新選擇的類別的產品了。如果AutoPostBack屬性設置為false(默認值),改變類別將不會導致回發,因此也就不能刷新產品列表了。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖五:在DropDownList的智能標簽中勾上“啟用自動回發”復選框


添加一個GridView控件到頁面上以便可以根據選定的類別來顯示產品。將這個GridView的ID設置為ProductsInCategory,并將其綁定到一個新的名為ProductsInCategoryDataSource的ObjectDataSource上。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖六:添加一個新的名為ProductsInCategoryDataSource的ObjectDataSource

配置這個ObjectDataSource,以使其調用ProductsBLL類的GetProductsByCategoryID(categoryID)方法。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖七:使這個ObjectDataSource調用GetProductsByCategoryID(categoryID)方法


由于GetProductsByCategoryID(categoryID)方法需要一個參數,所以在向導的最后一步里,我們可以指定參數值的數據源。為了根據顯示所選的類別來顯示產品,這個參數應該從Categories下拉框中獲取。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖八:從Catefories下拉框中獲取categoryID參數


完成了向導之后,這個GridView將會包含一些對應于產品的每一個屬性的BoundField。讓我們來清理一下這些BoundField,剩下要顯示的ProductName、UnitPrice、UnitsInStock以及UnitsOnOrder就可以了。然后你可以隨便的給剩下的這些BoundField添加一些字段級的設置(比如說將UnitPrice格式化為貨幣形式)。做了這些更改之后,這個GridView的聲明標記應該是這個樣子:

1<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>

現在,我們就擁有了一個可以根據所選類別來顯示相關的產品的名稱、單價、庫存量以及訂貨量的功能齊全的主/從報表了。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖九:現在的效果(譯者注:估計原文這里弄錯了,寫得跟圖八的一樣。這里的原文是“Figure 9: Get the categoryID Parameter Value from the Selected Categories DropDownList”,圖八的原文是“Figure 8: Get the categoryID Parameter Value from the Selected Categories DropDownList”)


第二步:在GridView中顯示頁腳

GridView控件可以顯示頁眉和頁腳行。這些行的顯示與否分別取決于ShowHeader和ShowFooter屬性,默認情況下,ShowHeader的值為true,而ShowFooter的值為false。要顯示頁腳行的話,我們只需簡單的將ShowFooter屬性設置為true就可以了。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖十:將GridView的ShowFooter屬性設置為true

GridView中所定義的每一個字段都在頁腳行中有一個對應的單元格,不過這些單元格默認是空的。花點時間到瀏覽器中看看我們的成果。由于我們將GridView的ShowFooter屬性設置為true了,所以GridView現在包含了一個空的頁腳行。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖十一:現在,GridView有了一個頁腳行


圖十一中的頁腳行并不明顯,因為它的背景是白色的。讓我們在Styles.css中創建一個名為FooterStyle的CSS類,用它來指定一個深紅色的背景,并在DataWebControls主題中配置GridView.skin這個皮膚文件(Skin file)以將此CSS類分配給此GridView的FooterStyle的CssClass屬性。如果你需要復習一下皮膚和主題的相關內容,請參考“使用ObjectDataSource顯示數據”。

先給Styles.css添加以下的CSS類:

1.FooterStyle
2{}{
3 background-color: #a33;
4 color: White;
5 text-align: right;
6}

FooterStyle這個CSS類跟HeaderStyle類是一樣的,只是HeaderStyle的背景色要深一點且文本是粗體顯示的而已。此外,頁腳的文本是右對齊的,而頁眉的文本是居中的。然后,為了將這個CSS類關聯到每一個GridView的頁腳上,在DataWebControls主題中打開GridView.skin文件并設置FooterStyle的CssClass屬性。作了這個添加之后,文件的標記代碼應該是這個樣子:

1<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>

就像下面這個屏幕截圖所顯示的那樣,這個更改使頁腳清晰的顯示出來了。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖十二:GridView的頁腳現在有了一個紅紅的背景色


第三步:計算統計數據


在顯示了GridView的頁腳之后,下一個面對我們的挑戰就是如何計算統計數據。有兩個計算統計信息的途徑:

1. 通過一個SQL查詢——我們可以向數據庫發出一個額外的查詢來為某個特定的類別計算統計信息。SQL包含一系列的聚合函數,并由GROUP BY子句指定應該根據什么數據來進行統計。下面的SQL查詢將會返回我們所需要的信息:

SELECT CategoryID, AVG(UnitPrice), SUM(UnitsInStock), SUM(UnitsOnOrder)
FROM Products
WHERE CategoryID = categoryID
GROUP BY CategoryID

當然,你也可能不喜歡直接在SummaryDataInFooter.aspx頁面中直接執行這個查詢,而是希望在ProductsTableAdapter 和ProductsBLL 中創建一個方法來干這個事情。

2. 由于這些信息已經添加到GridView中了,所以可以直接計算——就像在“基于數據的自定義格式化”中討論的那樣,在GridView的數據綁定之后,GridView的RowDataBound事件處理方法會在添加每一行數據時被執行一次。為這個事件創建了事件處理方法之后,我們就可以保持一個累積的合計值了。在最后一行數據被綁定到DataGrid上之后,我們就有了一個合計值以及需要計算平均值的信息了。

一般來說,我還是喜歡第二種方法的,因為它節省了一次到數據庫的往返,而且要達到這個效果還需要在數據訪問層和業務邏輯層中實現統計功能,不過話說回來了,其實兩種辦法都行的。在這本教程中,我們還是使用第二個辦法吧,并使用RowDataBound事件處理方法來記錄這個累積合計。


給GridView新建一個RowDataBound事件處理方法,你可以在設計器中選擇GridView,然后在屬性窗口中點擊那個帶閃電符號的圖標,找到RowDataBound事件并雙擊它就可以了。這樣就會在SummaryDataInFooter.aspx頁面的后置代碼類中添加一個新的名為ProductsInCategory_RowDataBound的事件處理方法了。

protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
{

}

為了可以維護一個累積合計,我們需要在這個事件處理方法的外面定義一些變量。創建以下4個頁面級的變量:

· _totalUnitPrice,類型為decimal

· _totalNonNullUnitPriceCount,類型為int

· _totalUnitsInStock,類型為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的時候被觸發,頁腳行也不例外。因此,我們可以擴展我們的事件處理方法,讓它可以通過如下的代碼來在頁腳行中顯示數據:

protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//……增加累積合計……
}
else if (e.Row.RowType == DataControlRowType.Footer)
{
//……在頁腳中顯示統計數據……
}
}

因為頁腳行是在所有的數據行都已經添加之后才添加到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 = "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")是如何讓平均價格這個統計信息格式化成貨幣形式的。
Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息

圖十三:現在的效果(譯者注:估計原文這里又弄錯了,寫得跟圖十二的一樣。這里的原文是“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、DetailsView以及FormView控件的自定義格式化的學習。接下來的教程中,我們會開始一個使用這些控件來進行增刪改操作的探索。


編程愉快!

關于作者


Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創始人,自1998年以來一直應用微軟Web技術。Scott是個獨立的技術咨詢顧問,培訓師,作家,最近完成了將由Sams出版社出版的新作,24小時內精通ASP.NET 2.0。他的聯系電郵為 mitchell@4guysfromrolla.com ,也可以通過他的博客 http://ScottOnWriting.NET 與他聯系。

Scott Mitchell 的ASP.NET 2.0數據教程之十五:在GridView的頁腳中顯示統計信息


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久毛片蜜月 | 91视频免费入口 | 国产福利在线观看第二区 | 久久香蕉国产线看观看精品蕉 | 亚洲综合中文网 | 高清成人综合 | 国产高清不卡一区二区 | 亚洲va久久久久综合 | 60欧美老妇做爰视频 | 在线欧美日韩 | 免费黄色视屏网站 | 国产亚洲天堂 | 久久99国产精品久久99无号码 | 国产日韩成人 | 91丨九色丨蝌蚪 | 四虎免费视频 | 免费国产不卡午夜福在线观看 | 国产国产成人人免费影院 | 特级黄色视频毛片 | 久99久爱精品免费观看视频 | 亚洲欧美成人永久第一网站 | 国产精品自线在线播放 | 国产永久在线观看 | 在线视频一区二区日韩国产 | 欧美成人久久一级c片免费 欧美成人剧情中文字幕 | 欧美日本亚洲国产一区二区 | 日韩精品高清自在线 | 偷偷鲁影院手机在线观看 | 国产成综合 | 欧美一级黄色录像 | 久在线精品视频 | 久久精品小视频 | 97色伦图片97色伦图影院久久 | 日本免费一区二区三区在线看 | 综合久久色 | 97人人澡人人爽人人爱 | 亚洲一级毛片欧美一级说乱 | 亚洲天堂久久久 | 亚洲第一视频在线播放 | 欧美性猛交aa一级 | 另类av |