在GridView的頁(yè)腳中顯示統(tǒng)計(jì)信息
在GridView的頁(yè)腳中顯示統(tǒng)計(jì)信息(首先要做的工作是把GridView的ShowFooter屬性設(shè)為true,并更改其style)
利用2種方法來統(tǒng)計(jì)數(shù)據(jù):
1. SQL查詢(統(tǒng)計(jì)的是全部項(xiàng))
SELECT CategoryID, AVG(UnitPrice), SUM(UnitsInStock), SUM(UnitsOnOrder)
FROM Products
WHERE CategoryID = categoryID
GROUP BY CategoryID
2.基于GridView的RowDataBound事件處理方法(它會(huì)在每一行綁定到GridView的時(shí)候被觸發(fā),但在加入Rows之前,可以使用e訪問)
要在頁(yè)腳的特定單元格中顯示文本,可以使用use e.Row.Cells[index].Text = value,單元格的索引是從0開始的。代碼如下:
protected void ProductsInCategory_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//……增加累積合計(jì)……
}
else if (e.Row.RowType == DataControlRowType.Footer)
{
// 確定平均單價(jià)
decimal avgUnitPrice = _totalUnitPrice / (decimal) _totalNonNullUnitPriceCount;
// 在相應(yīng)的單元格中顯示統(tǒng)計(jì)數(shù)據(jù),無需數(shù)據(jù)綁定
e.Row.Cells[1].Text = "Avg.: " + avgUnitPrice.ToString("c"); //格式化為貨幣格式
e.Row.Cells[2].Text = "Total: " + _totalUnitsInStock.ToString();
e.Row.Cells[3].Text = "Total: " + _totalUnitsOnOrder.ToString();
}
}
使用此種方法由于footer是在最后加入Rows的,所以可以統(tǒng)計(jì)出數(shù)據(jù),但是如果分頁(yè)的話,統(tǒng)計(jì)出的數(shù)據(jù)只代表當(dāng)前頁(yè)而非所有項(xiàng)。如下圖:

統(tǒng)計(jì)的數(shù)據(jù)是當(dāng)前頁(yè)而非全部
結(jié)束語(yǔ):數(shù)據(jù)表達(dá)的方式有多種,可以看具體情況選擇。下面的語(yǔ)句中還包含了一些東西,還要進(jìn)一步理解:Northwind.ProductsRow product = (Northwind.ProductsRow)((System.Data.DataRowView)e.Row.DataItem).Row;
概述插入、更新和刪除數(shù)據(jù)
在整個(gè)站點(diǎn)中加入一個(gè)新內(nèi)容的文件夾(下面包含很多頁(yè)面),要使這些它在站點(diǎn)導(dǎo)航中顯示,可以將建立的用戶控件(ascx文件)拖入文件下的默認(rèn)頁(yè)面中(default.aspx),并修改站點(diǎn)導(dǎo)航模板(sitemap文件),將新建頁(yè)面節(jié)點(diǎn)加入其中。
使用數(shù)據(jù)源配置向?qū)砼渲肙bjectDataSource的一個(gè)影響是Visual Studio設(shè)置了OldValuesParameterFormatString屬性為original_{0} 。這個(gè)屬性值用來包含數(shù)據(jù)被編輯時(shí)的原始值,它在下面兩種情況下非常有用:
1.如果,當(dāng)編輯一條記錄時(shí),用戶可以修改主鍵的值。在這種情況下,新的主鍵的值和原始的主鍵值都需要提供,這樣具有這個(gè)原始主鍵值的數(shù)據(jù)庫(kù)記錄才可以被找到然后才能將它的值更新。
2.當(dāng)使用開放式并發(fā)。開放式并發(fā)是為了保證同時(shí)操作的用戶不至于覆蓋另一個(gè)用戶所做更改的一種技巧.這個(gè)OldValuesParameterFormatString屬性指明了隱含對(duì)象的更新和刪除方法中對(duì)應(yīng)原始值的輸入?yún)?shù)的名稱。OldValuesParameterFormatString屬性設(shè)置為除了默認(rèn)值({0})以外的其它任何的值,都將在數(shù)據(jù)Web控件嘗試調(diào)用ObjectDataSource的Update()或Delete()方法時(shí)引發(fā)一個(gè)錯(cuò)誤,因?yàn)镺bjectDataSource將嘗試將這些原始值參數(shù)與UpdateParameters或DeleteParameters一起傳入。如果你忘記了從ObjectDataSource里刪除OldValuesParameterFormatString屬性。指定了OldValuesParameterFormatString屬性的話,該ObjectDataSource會(huì)試圖向DeleteProduct方法一并傳入productID和original_ProductID輸入?yún)?shù),然而,DeleteProduct方法只能接受一個(gè)輸入?yún)?shù),導(dǎo)致異常。刪除OldValuesParameterFormatString屬性(或設(shè)置它為{0})指示ObjectDataSource不要試圖傳入這個(gè)原始值的輸入?yún)?shù)。一個(gè)字段間約束也會(huì)阻止對(duì)數(shù)據(jù)(這里指產(chǎn)品)的刪除,導(dǎo)致異常。在一個(gè)真實(shí)的應(yīng)用程序中我們需要的是下面任一措施:(a) 通過另外一個(gè)頁(yè)面管理order details信息.(b) 在DeleteProduct方法里增加包含刪除指定產(chǎn)品的訂單明細(xì)的邏輯.(c) 修改TableAdapter所使用的SQL語(yǔ)句,包含對(duì)指定產(chǎn)品的訂單明細(xì)的刪除.
通過它的職能標(biāo)記綁定GridView到ObjectDataSource有下面兩點(diǎn)的好處:
1. 綁定列和CheckBox列被自動(dòng)地添加,對(duì)應(yīng)ObjectDataSource返回的每一個(gè)字段。而且,這些綁定列和CheckBox列的屬性已經(jīng)被設(shè)置,基于隱含字段的元數(shù)據(jù)。例如ProductID、CategoryName和SupplierName列(其它表的字段,BLL下ProductsBLL.cs提供的操作函數(shù)只針對(duì)本表,不對(duì)其它表操作,SQL語(yǔ)句{INSERT INTO [Products] ([ProductName], [SupplierID], [CategoryID], [QuantityPerUnit], [UnitPrice], [UnitsInStock], [UnitsOnOrder], [ReorderLevel], [Discontinued]) VALUES (@ProductName, @SupplierID, @CategoryID, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @UnitsOnOrder, @ReorderLevel, @Discontinued);SELECT SCOPE_IDENTITY()},故設(shè)置ReadOnly屬性為true)在ProductsDataTable里被標(biāo)記為只讀,因此它們?cè)诰庉嫊r(shí)也是不可更新的。為了實(shí)現(xiàn)這一點(diǎn),這些綁定列的ReadOnly屬性設(shè)置為true 。
2. DataKeyNames屬性被賦值為隱含對(duì)象的主鍵。這是在使用GridView來編輯或刪除數(shù)據(jù)的要點(diǎn),因?yàn)檫@個(gè)屬性象指出了標(biāo)識(shí)唯一記錄的那個(gè)字段(或是一組字段)。(DataKeyNames屬性讓每一行關(guān)聯(lián)一個(gè)或多個(gè)數(shù)據(jù)字段, 經(jīng)常用于唯一標(biāo)識(shí)GridView行. SelectedValue屬性返回選中行的DataKeyNames中的第一個(gè)數(shù)據(jù)字段的值, SelectedDataKey返回選中行的DataKey對(duì)象, 它包含了該行的所有指定數(shù)據(jù)主鍵字段的值.)
在GridView中,當(dāng)最終用戶點(diǎn)擊特定一行的編輯按鈕時(shí),引發(fā)一次回傳并且GridView執(zhí)行以下步驟:
1. GridView的EditItemIndex屬性被賦值為當(dāng)前點(diǎn)擊編輯按鈕的行的索引。
2. 通過調(diào)用它的Select()方法,GridView重新綁定自己到ObjectDataSource。
3. 與EditItemIndex相匹配的行呈現(xiàn)為編輯模式。在此模式下,編輯按鈕替換為保存和取消按鈕,并且那些ReadOnly屬性為False的綁定列呈現(xiàn)為TextBox服務(wù)器控件,這些TextBox的Text屬性被賦值為相應(yīng)的數(shù)據(jù)字段的值。
到這里HTML標(biāo)記被返回到瀏覽器,允許最終用戶可以修改行數(shù)據(jù)。當(dāng)用戶點(diǎn)擊保存按鈕,再次發(fā)生一次回傳,并且GridView執(zhí)行以下幾個(gè)步驟:
1. ObjectDataSource的UpdateParameters的值被賦值為最終用戶在GridView的編輯界面輸入的值。
2. 調(diào)用ObjectDataSource的Update()方法,更新指定的記錄。
3. 通過調(diào)用它的Select()方法,GridView重新綁定自己到ObjectDataSource。
當(dāng)最終用戶點(diǎn)擊某一特定行的刪除按鈕時(shí),引發(fā)一次回傳并且GridView執(zhí)行以下步驟:
1. 對(duì)ObjectDataSource的DeleteParameters賦值
2. 調(diào)用ObjectDataSource的Delete()方法,刪除指定的記錄
3. 通過調(diào)用它的Select()方法GridView重新綁定到ObjectDataSource
賦值到DeleteParameters的值是點(diǎn)擊刪除按鈕這一行的DataKeyNames字段的值。因此正確地設(shè)置GridView的DataKeyNames屬性是至關(guān)重要的。如果缺少了這個(gè),DeleteParameters將在第1步被賦上一個(gè)null值,從而在第2步中將不會(huì)導(dǎo)致刪除任何記錄。
Scott Mitchell指出:DetailsView的CurrentMode 屬性指示當(dāng)前顯示的界面并可以被設(shè)置為下面幾個(gè)值之一:Edit、Insert或ReadOnly 。DefaultMode屬性則指示DetailsView在完成一次編輯或插入之后顯示的模式,這在需要讓DetailsView保持編輯或插入模式不變時(shí)是很有用的。
確實(shí)DefaultMode屬性則指示DetailsView在完成一次編輯或插入之后顯示的模式,比如事先更改DetailsView的DefaultMode為edit的話,那么網(wǎng)頁(yè)加載后DetailsView將會(huì)以edit的模式出現(xiàn),如下圖:

但"CurrentMode 屬性指示當(dāng)前顯示的界面并可以被設(shè)置為下面幾個(gè)值之一:Edit、Insert或ReadOnly 。"如何理解?當(dāng)更改其值(賦值)時(shí),編譯器提示該屬性為只讀,那么如何來利用該屬性呢?