簡(jiǎn)介
GridView和DetailsView控件通過(guò)綁定列和CheckBox列,可以簡(jiǎn)化數(shù)據(jù)編輯界面制作,呈現(xiàn)只讀,編輯和新增界面,我們不需要增加元素標(biāo)記或編寫(xiě)任何額外代碼就可以得到這些界面。然而,綁定列和CheckBox列呈現(xiàn)的界面卻缺乏實(shí)際應(yīng)用中經(jīng)常用到的定制功能。為了對(duì)GridView和DetailsView的編輯、新增界面進(jìn)行定制,需要用模板列(TemplateField)替換原有列。
在上節(jié)教程中我們討論如何增加驗(yàn)證控件來(lái)定制數(shù)據(jù)編輯界面,而本節(jié)教程將演示如何使用Web控件對(duì)實(shí)際的數(shù)據(jù)集合進(jìn)行定制:將綁定列和CheckBox列中默認(rèn)的TextBox、CheckBox控件替換成其他的輸入控件。為此,我們將創(chuàng)建一個(gè)可編輯的GridView,并允許編輯更新產(chǎn)品的名字、類(lèi)別、提供商和廢棄狀態(tài)等。而且編輯某行時(shí),類(lèi)別category和提供商supplier我們將使用DropDownList來(lái)顯示,以供用戶進(jìn)行選擇。此外,還將CheckBox列中默認(rèn)的CheckBox控件替換成RadioButtonList控件,并提供2個(gè)單選選項(xiàng):Active和Discontinued。 如圖1:
![](/d/20211017/cfbc6a5ef0d5678db17164a3bd1051fc.gif)
圖1:在GridView的編輯界面使用DropDownList和RadioButton控件
一、重載UpdateProduct方法
本節(jié)教程我們將創(chuàng)建一個(gè)可編輯的GridView并允許編輯更新產(chǎn)品的名字、類(lèi)別、提供商和廢棄狀態(tài)等。因此,我們要重載UpdateProduct方法,并接受5個(gè)輸入?yún)?shù):4個(gè)產(chǎn)品參數(shù)值加上一個(gè)產(chǎn)品ID。像以前那樣,本重載將:
1. 根據(jù)指定的ProductID從數(shù)據(jù)庫(kù)中獲取產(chǎn)品信息;
2. 更新ProductName,categoryID,supplierID和Discontinued字段;
3. 通過(guò)TableAdapter的Update()方法向數(shù)據(jù)訪問(wèn)層DAL發(fā)出更新請(qǐng)求。
簡(jiǎn)單起見(jiàn),這個(gè)重載方法省略了一個(gè)重要的業(yè)務(wù)邏輯――檢查并確保一個(gè)將會(huì)標(biāo)記為discontinued的產(chǎn)品不是它的提供商提供的唯一產(chǎn)品。你愿意的話也可以加進(jìn)來(lái),或者做的更完善一些,將這個(gè)邏輯寫(xiě)到一個(gè)獨(dú)立的方法中。
下面的代碼是我們?cè)赑roductsBLL類(lèi)中新增的UpdateProduct重載方法:
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, int? categoryID,
int? supplierID, bool discontinued, int productID)
{
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
if (products.Count == 0)
// no matching record found, return false
return false;
Northwind.ProductsRow product = products[0];
product.ProductName = productName;
if (supplierID == null) product.SetSupplierIDNull();
else product.SupplierID = supplierID.Value;
if (categoryID == null) product.SetCategoryIDNull();
else product.CategoryID = categoryID.Value;
product.Discontinued = discontinued;
// Update the product record
int rowsAffected = Adapter.Update(product);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
二、手工處理可編輯的GridView
編寫(xiě)完UpdateProduct重載方法,下面要做的是創(chuàng)建可編輯的GridView:在設(shè)計(jì)器窗口中打開(kāi)EditInsertDelete 文件夾中的CustomizedUI.aspx頁(yè),為其增加一個(gè)GridView控件;接著通過(guò)GridView的智能標(biāo)記創(chuàng)建一個(gè)新的ObjectDataSource,配置這個(gè)ObjectDataSource使用ProductBLL類(lèi)的GetProducts()方法來(lái)獲取產(chǎn)品信息,并讓其使用上面創(chuàng)建的UpdateProduct重載方法來(lái)進(jìn)行產(chǎn)品的更新。在新增和刪除標(biāo)簽上,從下拉列表中選擇(None)。
![](/d/20211017/284aab29c89366a447c026834a361a17.gif)
圖2:配置ObjectDataSource使用上面創(chuàng)建的UpdateProduct重載方法
像《data modification》教程中那樣,Visual Studio創(chuàng)建了ObjectDataSource的元素標(biāo)記并指定OldValuesParameterFormatString屬性為original_{0}。由于我們編寫(xiě)的方法不支持傳入的原始的ProductID值,所以業(yè)務(wù)邏輯層不會(huì)生效。因此,像上節(jié)教程中那樣,我們需要從元素標(biāo)記中移除這些屬性,或者設(shè)置這些屬性。
改動(dòng)后的ObjectDataSource元素標(biāo)記將如下所示:
asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetProducts" TypeName="ProductsBLL"
UpdateMethod="UpdateProduct">
UpdateParameters>
asp:Parameter Name="productName" Type="String" />
asp:Parameter Name="categoryID" Type="Int32" />
asp:Parameter Name="supplierID" Type="Int32" />
asp:Parameter Name="discontinued" Type="Boolean" />
asp:Parameter Name="productID" Type="Int32" />
/UpdateParameters>
/asp:ObjectDataSource>
注意上面代碼中OldValuesParameterFormatString已經(jīng)被移除,并且在UpdateParameters集合中為UpdateProduct重載方法的每個(gè)入口參數(shù)提供了一個(gè)Parameter。
雖然ObjectDataSource被配置為只對(duì)產(chǎn)品的部分信息進(jìn)行更新,而GridView卻顯示了所有的產(chǎn)品信息。我們需要按照下面幾點(diǎn)來(lái)調(diào)整GridView:
1. 只包括ProductName, SupplierName, CategoryName字段的綁定列和Discontinued字段的CheckBox列。
2. CategoryName 和 SupplierName字段在Discontinued前面顯示(左邊)
3. 將CategoryName 和 SupplierName的標(biāo)題分別改為“Category” 和 “Supplier”
4. 啟用編輯模式(在GridView的智能標(biāo)記中選擇啟用編輯復(fù)選框)
這些調(diào)整之后,設(shè)計(jì)器中的頁(yè)面將如圖3所示:
![](/d/20211017/da10fc0fe4cdd402be4e71b63c0a3d7d.gif)
圖3:移除GridView中無(wú)用的字段
GridView的元素標(biāo)記也像下面所示:
asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
Columns>
asp:BoundField DataField="ProductName"
HeaderText="ProductName" SortExpression="ProductName" />
asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True"
SortExpression="CategoryName" />
asp:BoundField DataField="SupplierName" HeaderText="Supplier"
ReadOnly="True"
SortExpression="SupplierName" />
asp:CheckBoxField DataField="Discontinued"
HeaderText="Discontinued" SortExpression="Discontinued" />
/Columns>
/asp:GridView>
這時(shí)GridView的只讀界面就改好了。查看數(shù)據(jù)時(shí),每種產(chǎn)品就作為GridView中的一行,并顯示產(chǎn)品的name,category,supplier和discontinued狀態(tài)。
![](/d/20211017/adcb0e43d34f82fd8e1b441471628463.gif)
圖4: GridView調(diào)整后的只讀界面
三、在編輯界面中使用DropDownList顯示Category和Supplier
我們注意到ProductsRow對(duì)象包含產(chǎn)品的CategoryID,CategoryName,SupplierID和SupplierName屬性,但是Products數(shù)據(jù)庫(kù)只保存了外鍵,而對(duì)應(yīng)的Name保存在Categories和Suppliers表中。ProductsRow對(duì)象中的CategoryID和SupplierID可以讀取和寫(xiě)入,而CategoryName和SupplierName屬性則標(biāo)記為只讀。
由于CategoryName和SupplierName的只讀狀態(tài),相應(yīng)綁定列的ReadOnly屬性也被置為true,防止編輯某行時(shí)它們的值被修改。盡管也可以通過(guò)設(shè)置ReadOnly屬性為false,使其在編輯狀態(tài)將這些綁定列轉(zhuǎn)為T(mén)extBox,但是這樣以來(lái)當(dāng)用戶嘗試更新產(chǎn)品信息時(shí)系統(tǒng)就會(huì)拋出異常,因?yàn)閁pateProduct重載中并不接受CategoryName和SupplierName參數(shù)。事實(shí)上,我們也不想編寫(xiě)這種重載方法,原因如下:
1. Products表沒(méi)有SupplierName和CategoryName字段,而是對(duì)應(yīng)的外鍵SupplierID和CategoryID。因此,我們希望在更新方法中傳遞外鍵ID,而不是查找外鍵表中的值。
2. 要求用戶鍵入supplier或者category的名字也很不合理,因?yàn)檫@要求用戶必須知道合法的category和supplier,并且拼寫(xiě)正確無(wú)誤。
我們打算在只讀模式Supplier和category列分別顯示了分類(lèi)和提供商的名字,而在編輯時(shí),通過(guò)下拉列表顯示可用選項(xiàng)。這樣以來(lái),用戶可以快速查看有效的category和supplier并且可以很便捷直觀的進(jìn)行選擇。
要實(shí)現(xiàn)這一點(diǎn),需要將SupplierName和CategoryName對(duì)應(yīng)的綁定列轉(zhuǎn)換為模板列,在ItemTemplate模板中顯示SupplierName和CategoryName,而EidtItemTemplate模板則使用DropDownList控件列出有效的cagegory和supplier。
添加Categories和Suppliers 的DropDownList控件
我們要先將SupplierName和CategoryName綁定列轉(zhuǎn)換為模板列:點(diǎn)擊GridView智能標(biāo)記中的‘編輯列'鏈接;選擇左下的BoundField;點(diǎn)擊“將此字段轉(zhuǎn)換為T(mén)emplateField”鏈接,轉(zhuǎn)換過(guò)程將創(chuàng)建一個(gè)模板列,包括ItemTemplate和EditItemTemplate,最終的元素標(biāo)記大致如下:
asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
EditItemTemplate>
asp:Label ID="Label1" runat="server"
Text='%# Eval("CategoryName") %>'>/asp:Label>
/EditItemTemplate>
ItemTemplate>
asp:Label ID="Label1" runat="server"
Text='%# Bind("CategoryName") %>'>/asp:Label>
/ItemTemplate>
/asp:TemplateField>
由于綁定列標(biāo)記為只讀,ItemTemplate和EditItemTemplate都將用Label控件的Text屬性綁定顯示相關(guān)數(shù)據(jù)(如上面的CategoryName)。因此需要修改EditItemTemplate模板,用DropDownList控件來(lái)替換原來(lái)的Label控件。
像上節(jié)教程講的,即可在設(shè)計(jì)器中編輯模板也可直接修改模板的元素標(biāo)記。要在設(shè)計(jì)器中修改,可以通過(guò)GridView的智能標(biāo)記點(diǎn)擊“編輯模板”鏈接并選擇Category字段的EditItemTemplate模板。刪除Label控件用DropDownList控件代替,并設(shè)置DropDownList的ID屬性為Categories。
![](/d/20211017/98b132326918cfcda3eb43265e5458e6.gif)
圖5:刪除EditItemTemplate模板中的TextBox并增加一個(gè)DropDownList
下一步我們需要為DropDownList綁定category。從智能標(biāo)記中點(diǎn)擊“選擇數(shù)據(jù)源”鏈接并選擇創(chuàng)建一個(gè)新的ObjectDataSource,命名為CategoriesDataSource。
![](/d/20211017/450620fc5a3fac0a400a735d1c1224e3.gif)
圖6:創(chuàng)建一個(gè)新的ObjectDataSource控件CategoriesDataSource
為了使ObjectDataSource顯示所有的category,我們將它與CategoriesBLL類(lèi)的GetCategories()方法進(jìn)行綁定。
![](/d/20211017/4f56704edbd7f558d276961baf65c1ff.gif)
圖7:將ObjectDataSource控件用GategoriesBLL的GetCategories()方法進(jìn)行綁定
最后,配置DropDownList,用CategoryName字段作為顯示字段而CategoryID作為Value字段。
![](/d/20211017/922f5fe142a68b3711aeda74afe2d1c1.gif)
圖8:用CategoryName作為顯示字段并用CategoryID作為Value字段
改動(dòng)后CategoryName的模板項(xiàng)將擁有一個(gè)DropDownList控件和一個(gè)ObjectDataSource,元素標(biāo)記大致如下:
asp:TemplateField HeaderText="Category" SortExpression="CategoryName">
EditItemTemplate>
asp:DropDownList ID="Categories" runat="server"
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName" DataValueField="CategoryID">
/asp:DropDownList>
asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GetCategories" TypeName="CategoriesBLL">
/asp:ObjectDataSource>
/EditItemTemplate>
ItemTemplate>
asp:Label ID="Label1" runat="server"
Text='%# Bind("CategoryName") %>'>/asp:Label>
/ItemTemplate>
/asp:TemplateField>
注意:EditItemTemplate模板中的DropDownList必須啟用視圖狀態(tài)(view state)。下面我們將會(huì)在DropDownList的元素標(biāo)記中增加數(shù)據(jù)綁定語(yǔ)法和數(shù)據(jù)綁定命令例如Eval()和Bind(),它們要求啟用視圖狀態(tài),否則將無(wú)法顯示。
重復(fù)以上步驟為SupplierName的模板列中EditItemTemplate模板添加DropDownList控件,并命名為Suppliers。包括增加DropDownList控件和創(chuàng)建另一個(gè)ObjectDataSource,注意新的ObjectDataSource調(diào)用的是SuppliersBLL 類(lèi)的 GetSuppliers()方法。另外,配置Suppliers下拉框的顯示字段為CompanyName,value字段為SupplierID。
兩個(gè)下拉框都增加完成后,在瀏覽器中查看頁(yè)面并點(diǎn)擊“Chef Anton's Cajun Seasoning”產(chǎn)品的編輯按鈕。如圖9所示,產(chǎn)品的category和supplier列都變成了下拉框并包含了對(duì)應(yīng)的category和supplier選項(xiàng)集。但是,你會(huì)發(fā)現(xiàn)下拉框中默認(rèn)選擇的是下拉框的第一項(xiàng)(category是Beverages,supplier是Exotic Liquids),事實(shí)上它們分別應(yīng)該是Condiment和New Orleans Cajun Delights。
![](/d/20211017/3466da6b1c1b63cf8b96d30cca00fac3.gif)
圖9:下拉列表默認(rèn)選中的是第一項(xiàng)
此外,如果點(diǎn)擊更新,你會(huì)發(fā)現(xiàn)該產(chǎn)品的CategoryID 和 SupplierID都變成了NULL。這些都是由于EditItemTemplate模板中的下拉框沒(méi)有根據(jù)數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù)進(jìn)行綁定。
為DropDownList綁定CategoryID 和 SupplierID 數(shù)據(jù)
為了使product編輯狀態(tài)下的category和supplier下拉列表選中實(shí)際數(shù)據(jù),并使其可以根據(jù)用戶選擇調(diào)用BLL的UpdateProduct方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新,我們需要對(duì)兩個(gè)下拉框的SelectedValue分別綁定到CategoryID 和 SupplierID。例如對(duì)于Categories下拉框,我們直接在元素標(biāo)記中增加SelectedValue='%# Bind("CategoryID") %>'。
另一種做法是在設(shè)計(jì)器中,通過(guò)下拉框的智能標(biāo)記,點(diǎn)擊“編輯DataBinding”鏈接,設(shè)置編輯模板中的下拉框的數(shù)據(jù)綁定。接下來(lái),用雙重模式指定SelectedValue綁定到CategoryID字段(見(jiàn)圖10)。重復(fù)上面的方法之一,為Suppliers下拉框綁定SupplierID數(shù)據(jù)。
![](/d/20211017/d2469274ea2434d904fbe4b79e14d074.gif)
圖10:給DropDownList的SelectedValue屬性綁定CategoryID值
一旦完成兩個(gè)下拉框SelectedValue屬性的數(shù)據(jù)綁定,產(chǎn)品的category和supplier就會(huì)默認(rèn)選中實(shí)際選項(xiàng)了。在點(diǎn)擊Update按鈕時(shí),下拉框中的選擇也會(huì)準(zhǔn)確傳遞給UpdateProduct方法。圖11顯示了增加數(shù)據(jù)綁定后的代碼;注意如何選中下拉列表中的項(xiàng):Chef Anton's Cajun Seasoning產(chǎn)品的分類(lèi)和提供商分別選中了正確的Condiment和New Orleans Cajun Delights選項(xiàng)。
![](/d/20211017/29cda51a38d79ac917fc5a24ae8a0bee.gif)
圖11:修改后Categroy和Supplier正確選中了Product的實(shí)際數(shù)據(jù)
處理NULL值
Product表中的CategoryID 和 SupplierID列允許為NULL,而編輯模板中的下拉列表卻沒(méi)有NULL這一項(xiàng)。所以目前存在下面兩種問(wèn)題:
1. 用戶無(wú)法則現(xiàn)在的界面中將某個(gè)product非空的category或supplier設(shè)置為NULL
2. 如果產(chǎn)品的CategoryID 或 SupplierID為NULL,在點(diǎn)擊Edit按鈕時(shí)程序會(huì)拋出異常。這是因?yàn)锽ind()表達(dá)式中CategoryID(或SupplierID)返回NULL值時(shí),SelectedValue無(wú)法找到NULL這一列表項(xiàng)因而拋出異常。
為了支持CategoryID 和 SupplierID的NULL值,需要為兩個(gè)DropDownList增加一個(gè)NULL值選項(xiàng)。在《Master/Detail Filtering With a DropDownList》教程中,我們演示了為綁定的DropDownList增加列表項(xiàng),方法是將DropDownList的AppendDataBoundItems屬性設(shè)置為true并手動(dòng)增加一個(gè)值為-1的列表項(xiàng)。在ASP.NET的數(shù)據(jù)綁定邏輯中,空字符串將自動(dòng)轉(zhuǎn)換為NULL,NULL值也可以轉(zhuǎn)為空字符串。因此,本節(jié)教程我們將增加一個(gè)值為空字符串的列表項(xiàng)。
先將這兩個(gè)DropDownList的AppendDataBoundItems屬性設(shè)置為true。接著,用asp:ListItem>元素來(lái)增加一個(gè)NULL列表項(xiàng),元素標(biāo)記大致如下:
asp:DropDownList ID="Categories" runat="server" DataSourceID="CategoriesDataSource" DataTextField="CategoryName" DataValueField="CategoryID" SelectedValue='%# Bind("CategoryID") %>' AppendDataBoundItems="True">
asp:ListItem Value="">(None)/asp:ListItem>
/asp:DropDownList>
我們選擇了使用“(None)”作為列表項(xiàng)的文本顯示(Text),你也可以空字符串或別的字符。
注意:《Master/Detail Filtering With a DropDownList》教程演示過(guò)DropDownList列表項(xiàng)的增加方法――在設(shè)計(jì)器中點(diǎn)擊DropDownList的屬性窗口(F4)中的Item屬性(將顯示ListItem集合編輯器)。這次我們采用直接在元素標(biāo)記中增加NULL列表項(xiàng)。如果你使用集合編輯器,創(chuàng)建出的元素標(biāo)記將忽略空字符的Value,如:asp:ListItem>(None)/asp:ListItem>。看起來(lái)并無(wú)大礙,可是DropDownList對(duì)沒(méi)有Value的項(xiàng)則使用Text來(lái)代替,這樣以來(lái)選擇“None”時(shí),“None”則被賦予CategoryID,系統(tǒng)將產(chǎn)生異常。通過(guò)顯式設(shè)置Value="",選擇此項(xiàng),CategoryID 就被更新為NULL值了。
重復(fù)以上步驟設(shè)置Supplier的下拉框控件。
通過(guò)這一附加的列表項(xiàng),編輯界面就可以為Product的CategoryID 和 SupplierID設(shè)定NULL值了,見(jiàn)圖12
![](/d/20211017/6ca98631917fcbfbf754ddd14538634a.gif)
圖12:通過(guò)選擇(None)為產(chǎn)品的Category或Supplier指定NULL值。
四、用RadioButton表示Discontinued狀態(tài)
Product的Discontinued字段以CheckBox列呈現(xiàn),只讀模式是disabled的,只有編輯模式下才被enable。根據(jù)配套需要,我們可以使用模板列對(duì)其進(jìn)行定制。本節(jié)教程中,我們將使用含有RadioButtonList控件的模板列代替原來(lái)的CheckBox列,并帶有兩個(gè)選項(xiàng)-“Active” 和 “Discontinued” – 讓用戶選擇product的Discontinued值。
先將Discontinued的CheckBox列轉(zhuǎn)為模板列,會(huì)用到ItemTemplate 和 EditItemTemplate兩個(gè)模板。它們使用CheckBox并將通過(guò)Checked屬性綁定Discontinued字段,唯一的區(qū)別在于ItemTemplate模板中的CheckBox的Enabled屬性是false。
使用RadioButtonList控件替換掉原來(lái)ItemTemplate 和 EditItemTemplate模板中的CheckBox控件,并將它們的ID屬性都設(shè)置為DiscontinuedChoice。然后,設(shè)置RadioButtonLists的兩個(gè)單選按鈕項(xiàng),一個(gè)為“Active”標(biāo)簽,值為“False”,另一個(gè)為“Discontinued”標(biāo)簽,值為“True”。這些操作即可直接在元素標(biāo)記中添加asp:ListItem>元素,也可通過(guò)設(shè)計(jì)器中ListItem集合編輯器處理。圖13演示了指定兩個(gè)單選按鈕后的ListItem集合編輯器。
![](/d/20211017/a831aa893e62c634ebe684f4a801143c.gif)
圖13:為RadioButtonList增加Active和Discontinued選項(xiàng)
由于普通項(xiàng)模板ItemTemplate中的RadioButtonList不應(yīng)是編輯狀態(tài),所以設(shè)置Enabled屬性為false,而編輯狀態(tài)對(duì)應(yīng)的EditItemTemplate模板中RadioButtonList的Enabled屬性則應(yīng)設(shè)置為true。這樣以來(lái),非編輯行中單選按鈕作為只讀顯示,而編輯狀態(tài)則允許用戶進(jìn)行選擇。
仍然需要用數(shù)據(jù)庫(kù)中product的Discontinued數(shù)據(jù)綁定RadioButtonList控件的SelectedValue屬性。像本節(jié)教程前面那樣,即可直接添加綁定語(yǔ)法也可通過(guò)RadioButtonList的智能標(biāo)記中的‘編輯DataBinding'鏈接。
增加完這兩個(gè)RadioButtonList并做適當(dāng)配置后,Discontinued的模板列元素標(biāo)記大致如下:
asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
ItemTemplate>
asp:RadioButtonList ID="DiscontinuedChoice" runat="server" Enabled="False" SelectedValue='%# Bind("Discontinued") %>'>
asp:ListItem Value="False">Active/asp:ListItem>
asp:ListItem Value="True">Discontinued/asp:ListItem>
/asp:RadioButtonList>
/ItemTemplate>
EditItemTemplate>
asp:RadioButtonList ID="DiscontinuedChoice" runat="server" SelectedValue='%# Bind("Discontinued") %>'>
asp:ListItem Value="False">Active/asp:ListItem>
asp:ListItem Value="True">Discontinued/asp:ListItem>
/asp:RadioButtonList>
/EditItemTemplate>
/asp:TemplateField>
此時(shí),Discontinued列從CheckBox列轉(zhuǎn)變?yōu)橐粚?duì)單選按鈕(見(jiàn)圖14)。當(dāng)進(jìn)入product編輯界面時(shí),discontinued對(duì)應(yīng)的單選按鈕被選中,點(diǎn)擊更新時(shí)也會(huì)將新的狀態(tài)更新到數(shù)據(jù)庫(kù)。
![](/d/20211017/7dc2bacb8d3f17954faeee05710f74b8.gif)
圖14:表示Discontinued的CheckBox被替換成一對(duì)單選按鈕
注意:由于Product數(shù)據(jù)庫(kù)中的Discontinued字段不允許為NULL值,所以顯示界面中不用考慮NULL的情況。不過(guò)如果Discontinued允許NULL時(shí),就要在列表中增加第3個(gè)單選項(xiàng),值設(shè)為空字符串(Value=””),就像category和supplier的下拉框那樣。
小結(jié)
由于綁定列和CheckBox列自動(dòng)呈現(xiàn)了只讀、編輯和新增界面,缺少定制能力??墒俏覀儏s經(jīng)常需要對(duì)新增和編輯界面進(jìn)行定制,比如增加驗(yàn)證控件(上節(jié)教程)或定制數(shù)據(jù)集的用戶界面(本節(jié)教程)。用模板列TemplateField定制界面總結(jié)為以下幾步:
1. 增加模板列或者將現(xiàn)有的綁定列、CheckBox列轉(zhuǎn)為模板列。
2. 按照實(shí)際需要給界面增加控件
3. 給新增加的控件進(jìn)行相關(guān)字段的數(shù)據(jù)綁定。
定制過(guò)程除了使用內(nèi)建的ASP.NET控件,也可以在模板列中使用自定義控件,編譯過(guò)的服務(wù)器控件以及用戶控件。
祝編程快樂(lè)!
作者簡(jiǎn)介
Scott Mitchell,著有六本ASP/ASP.NET方面的書(shū),是4GuysFromRolla.com的創(chuàng)始人,自1998年以來(lái)一直應(yīng)用微軟Web技術(shù)。Scott是個(gè)獨(dú)立的技術(shù)咨詢顧問(wèn),培訓(xùn)師,作家,最近完成了將由Sams出版社出版的新作, 《24小時(shí)內(nèi)精通ASP.NET 2.0》(英文) 。 他的聯(lián)系電郵為mitchell@4guysfromrolla.com,也可以通過(guò)他的博客http://scottonwriting.net/與他聯(lián)系。
您可能感興趣的文章:- asp.net中用DataReader高效率分頁(yè)
- asp.net中讓Repeater和GridView支持DataPager分頁(yè)
- Asp.net GridView使用大全(分頁(yè)實(shí)現(xiàn))
- ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(PagedList.Mvc)
- asp.net中的GridView分頁(yè)問(wèn)題
- asp.net使用AJAX實(shí)現(xiàn)無(wú)刷新分頁(yè)
- asp.net gridview分頁(yè):第一頁(yè) 下一頁(yè) 1 2 3 4 上一頁(yè) 最末頁(yè)
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十一:實(shí)現(xiàn)開(kāi)放式并發(fā)
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十二:為刪除數(shù)據(jù)添加客戶端確認(rèn)
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對(duì)修改數(shù)據(jù)進(jìn)行限制
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十四:分頁(yè)和排序報(bào)表數(shù)據(jù)
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十五:大數(shù)據(jù)量時(shí)提高分頁(yè)的效率