成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 在ASP.NET 2.0中操作數(shù)據(jù)之六十二:GridView批量更新數(shù)據(jù)

在ASP.NET 2.0中操作數(shù)據(jù)之六十二:GridView批量更新數(shù)據(jù)

熱門標(biāo)簽:網(wǎng)絡(luò)電話外呼系統(tǒng)上海 外呼電話機(jī)器人成本 西寧呼叫中心外呼系統(tǒng)線路商 蘇州如何辦理400電話 臨沂智能電話機(jī)器人加盟 地圖標(biāo)注軟件免費(fèi)下載 百應(yīng)電話機(jī)器人外呼系統(tǒng) 聯(lián)通官網(wǎng)400電話辦理 400電話辦理怎么樣

導(dǎo)言:

  在前面的教程,我們對數(shù)據(jù)訪問層進(jìn)行擴(kuò)展以支持?jǐn)?shù)據(jù)庫事務(wù).數(shù)據(jù)庫事務(wù)確保一系列的操作要么都成功,要么都失敗。本文我們將注意力轉(zhuǎn)到創(chuàng)建一個(gè)批更新數(shù)據(jù)界面.

  在本文,我們將創(chuàng)建一個(gè)GridView控件,里面的每一行記錄都可以進(jìn)行編輯(見圖1),因此我們沒有必要多添加一列來包含Edit, Update,和Cancel按鈕,而是在頁面包含2個(gè)“Update Products”按鈕,被點(diǎn)擊時(shí),遍歷所有的產(chǎn)品并對數(shù)據(jù)庫進(jìn)行更新.讓我們開始吧.


圖1:GridView控件里的每一行記錄都可以編輯

  注意:在第37章《DataList批量更新》里我們用一個(gè)DataList控件創(chuàng)建了一個(gè)批編輯界面, 那篇文章與本文的區(qū)別之一在于本文使用GridView控件且使用了事務(wù).

考察設(shè)置所有GridView Rows可編輯的步驟

  就像在第16章《概述插入、更新和刪除數(shù)據(jù)》考察的那樣,GridView控件使用內(nèi)置的編輯功能編輯每一行記錄。在其內(nèi)部,GridView控件通過EditIndex屬性來判斷哪一行可編輯. 一旦GridView綁定到數(shù)據(jù)源之后,它就逐行檢查,看哪行的index值與EditIndex的值匹配,如果找到的話,該行就呈現(xiàn)為編輯界面.如果是綁定列(BoundFields),則呈現(xiàn)為一個(gè)TextBox,其Text值為對應(yīng)的BoundField的DataField屬性的值;如果是模板列(TemplateFields),那么呈現(xiàn)為EditItemTemplate而不是ItemTemplate.

  我們知道當(dāng)某個(gè)用戶點(diǎn)擊某行的Edit按鈕時(shí),頁面產(chǎn)生回傳,將該行的index值為GridView控件的EditIndex屬性賦值,再重新綁定數(shù)據(jù).當(dāng)點(diǎn)擊某行的Cancel按鈕后產(chǎn)生頁面回傳,在重新綁定數(shù)據(jù)以前,將EditIndex屬性設(shè)置為-1.因?yàn)?,對GridView控件的rows而言,開始時(shí)Index值為0,而將EditIndex設(shè)為-1的話就變成只讀模式了.

  如果只對行進(jìn)行編輯,EditIndex屬性工作正常,但不支持批編輯。要對GridView實(shí)施批編輯的話,我們必須使每行都呈現(xiàn)為編輯界面.為此,最簡單的方法是將要編輯的列,轉(zhuǎn)換為TemplateField,然后在ItemTemplate模板里創(chuàng)建編輯界面.在接下來的幾步,我們將創(chuàng)建一個(gè)完整的可批編輯的GridView,在第一步,我們將創(chuàng)建一個(gè)GridView及其ObjectDataSource,并將BoundFields和CheckBoxField轉(zhuǎn)換為TemplateFields。在第二步和第三步,我們將編輯界面從ItemTemplates模板轉(zhuǎn)移到EditItemTemplates.

第一步:展示Product信息

  首先,我們先創(chuàng)建一個(gè)顯示產(chǎn)品信息的GridView.打開BatchData文件夾里的頁面BatchUpdate.aspx,從工具箱拖一個(gè)GridView控件到頁面,設(shè)ID值為ProductsGrid,從其智能標(biāo)簽里綁定到一個(gè)名為ProductsDataSource的ObjectDataSource,設(shè)其調(diào)用ProductsBLL class類的GetProducts方法.


圖2:設(shè)置ObjectDataSourc調(diào)用ProductsBLL Class類


圖3: 使用GetProducts方法獲取產(chǎn)品信息

  像GridView一樣,該ObjectDataSource調(diào)用的方法也只能對每行記錄起作用。為了批更新記錄,我們必須在ASP.NET頁面的后臺代碼類里多寫些代碼,批處理數(shù)據(jù)并傳遞給BLL.因此,在ObjectDataSource的UPDATE, INSERT,和DELETE標(biāo)簽里選“(None)”. 點(diǎn)Finish完成設(shè)置.


圖4:在UPDATE, INSERT,和DELETE標(biāo)簽里選“(None)”

完成設(shè)置后,ObjectDataSource控件的聲明代碼看起來和下面的差不多:

asp:ObjectDataSource ID="ProductsDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetProducts" TypeName="ProductsBLL">
/asp:ObjectDataSource>

  完成設(shè)置后,Visual Studio會向GridView控件添加BoundFields以及一個(gè) CheckBoxField.就本文而言,我們只允許用戶查看和編輯產(chǎn)品的名稱、類別、價(jià)格、以及discontinued狀態(tài).將ProductName, CategoryName, UnitPrice和 Discontinued以外的列全部刪除,并分別將頭3個(gè)列的HeaderText屬性設(shè)置為“Product”, “Category”,“Price”。最后,啟用GridView的分頁、排序功能.

  此時(shí),GridView控件含有3個(gè)BoundFields(ProductName,CategoryName,和UnitPrice)以及一個(gè)CheckBoxField (Discontinued).我們希望將這4個(gè)列轉(zhuǎn)換為TemplateFields,并將編輯界面從TemplateField的EditItemTemplate模板轉(zhuǎn)移到ItemTemplate模板.

  注意:我們在第20章《定制數(shù)據(jù)修改界面》里探討了如何創(chuàng)建并定制TemplateFields.我們將BoundFields和CheckBoxField轉(zhuǎn)換成TemplateFields,然后再在ItemTemplates模板里定制其編輯界面。如果有什么不清楚的,可參考前面的文章.

  從GridView的智能標(biāo)簽里,點(diǎn)“編輯列”,這將打開Fields對話框,然后選中每一列,點(diǎn)擊“Convert this field into a TemplateField”。


圖5:將現(xiàn)有的BoundFields和CheckBoxField轉(zhuǎn)換為TemplateField

  現(xiàn)在每一列都是TemplateField,我們將把編輯界面從EditItemTemplates模板轉(zhuǎn)移到ItemTemplates模板.

第2步:創(chuàng)建ProductName, UnitPrice,和Discontinued列的編輯界面

  創(chuàng)建ProductName, UnitPrice,和Discontinued這3列的編輯界面是比較簡單的,因?yàn)樗鼈兌荚赥emplateField的EditItemTemplate模板里定義好了的;而創(chuàng)建CategoryName的編輯界面比較麻煩,因?yàn)槲覀冃枰獎?chuàng)建一個(gè)DropDownList控件來顯示可用的categories,我們將在第3步實(shí)現(xiàn).

  我們首先創(chuàng)建ProductName的編輯界面。在GridView控件的智能標(biāo)簽里點(diǎn)“編輯模板”,再點(diǎn)ProductName TemplateField的EditItemTemplate項(xiàng).選中其中的TextBox,將其復(fù)制、粘貼到ProductName TemplateField的ItemTemplate模板.將該TextBox的ID屬性設(shè)置為ProductName.

  然后,在ItemTemplate模板里添加一個(gè)RequiredFieldValidator控件,以確保用戶輸入的產(chǎn)品name不為空.將其ControlToValidate屬性設(shè)置為“ProductName”;ErrorMessage屬性為“You must provide the product's name.”;Text屬性為“*”.添加完后,屏幕看起來應(yīng)該像圖6那樣:


圖6:ProductName TemplateField現(xiàn)在包含一個(gè)TextBox控件和一個(gè) RequiredFieldValidator控件

  對UnitPrice編輯界面而言,先從EditItemTemplate模板里將TextBox拷貝到ItemTemplate模板.然后,在TextBox前面放置一個(gè)“$”符合,將其ID屬性設(shè)置為“UnitPrice”;Columns屬性設(shè)置為“8”.

  然后再添加一個(gè)CompareValidator控件,確保用戶輸入的是大于或等于$0.00的貨幣值.設(shè)其ControlToValidate屬性為“UnitPrice”;ErrorMessage 屬性為“You must enter a valid currency value. Please omit any currency symbols.”;Text屬性為“*”;Type屬性為Currency;Operator屬性為GreaterThanEqual;ValueToCompare屬性為“0”.


圖7:添加一個(gè)CompareValidator控件以確保用戶輸入的是非負(fù)的貨幣值

  對Discontinued TemplateField而言,直接使用已經(jīng)在ItemTemplate模板里定義好了的CheckBox,只需要設(shè)其ID為“Discontinued”,Enabled屬性為true.

第三步:創(chuàng)建CategoryName的編輯界面

  CategoryName TemplateField的EditItemTemplate模板里的編輯界面里包含一個(gè)TextBox,其用來顯示CategoryName列的值,我們要將其替換為一個(gè)DropDownList控件以顯示categories.
注意:在第20章《定制數(shù)據(jù)修改界面》里我們詳細(xì)地探討了如何用DropDownList控件來替換TextBox控件。在此我們將過程一略而過,具體創(chuàng)建和設(shè)置DropDownList控件的細(xì)節(jié)可參考第20章.

  從工具箱里拖一個(gè)DropDownList控件到CategoryNameTemplateField的ItemTemplate模板, 設(shè)其ID為Categories.通常情況下,我們會通過其智能標(biāo)簽來定義DropDownLists的數(shù)據(jù)源,來創(chuàng)建一個(gè)新的ObjectDataSource.然而,這將在ItemTemplate模板里新添一個(gè)ObjectDataSource,后果是每一個(gè)GridView row都會創(chuàng)建一個(gè)ObjectDataSource實(shí)例.因此,我們在GridView的TemplateFields外創(chuàng)建ObjectDataSource.結(jié)束模板編輯,從工具箱拖一個(gè)ObjectDataSource到頁面,放置在名為ProductsDataSource的ObjectDataSource控件下面。將該新O用GetCategories Method bjectDataSource命名為CategoriesDataSource,設(shè)其使用CategoriesBLL class類的GetCategories方法.


圖8:設(shè)置該ObjectDataSource使用CategoriesBLL類


圖9:從GetCategories方法獲取數(shù)據(jù)

  因?yàn)樵揙bjectDataSource僅僅是用來檢索數(shù)據(jù),在UPDATE 和 DELETE標(biāo)簽里選 “(None)”.  點(diǎn)Finish完成設(shè)置.


圖10:在UPDATE和DELETE標(biāo)簽里選“(None)”

完成設(shè)置后,CategoriesDataSource的聲明代碼看起來根下面的差不多:

asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetCategories" TypeName="CategoriesBLL">
/asp:ObjectDataSource>

  設(shè)置好后,返回CategoryName TemplateField的ItemTemplate模板,在DropDownList的智能標(biāo)簽里點(diǎn)“Choose Data Source”,在數(shù)據(jù)源設(shè)置向?qū)Ю?,在第一個(gè)下拉列表里選CategoriesDataSource;再下面的2個(gè)下拉列表里分別選CategoryName和CategoryID.


圖11:將DropDownList控件綁定到CategoriesDataSource

  此時(shí),DropDownList控件雖然列出了所有的categories,但對綁定到GridViewrow里的產(chǎn)品而言,其并沒有自動的選擇產(chǎn)品對應(yīng)的category.為此,我們將DropDownList的SelectedValue值設(shè)置為產(chǎn)品的CategoryID值。在DropDownList的智能標(biāo)簽里點(diǎn)“Edit DataBindings”,并將SelectedValue屬性賦值為CategoryID ,如圖12:


圖12:將產(chǎn)品的CategoryID值綁定到DropDownList的SelectedValue屬性

  還有最后一個(gè)問題,如果產(chǎn)品的CategoryID為空的話,對SelectedValue的數(shù)據(jù)綁定將會拋出異常. 因?yàn)镈ropDownList只列出了那些指定了CategoryID值的產(chǎn)品,但不會列出那些CategoryID值為NULL的產(chǎn)品.怎樣解決呢?將DropDownList的AppendDataBoundIt屬性設(shè)為rue,并向DropDownList新添加一個(gè)item,忽略其Value屬性就像下面的聲明代碼那樣:

asp:DropDownList ID="Categories" runat="server" AppendDataBoundItems="True"
 DataSourceID="CategoriesDataSource" DataTextField="CategoryName"
 DataValueField="CategoryID" SelectedValue='%# Bind("CategoryID") %>'>
 asp:ListItem Value="">-- Select One --/asp:ListItem>
/asp:DropDownList>

  我們注意到asp:ListItem Value=""> “-- Select One --”里,將Value屬性設(shè)置為一個(gè)空字符串.為什么要新添該item來處理值為NULL的情況?為什么要將Value屬性設(shè)置為一個(gè)空字符串呢?這些疑問可參考前面第20章《定制數(shù)據(jù)修改界面》

  注意:這里有一個(gè)關(guān)乎性能的潛在問題要提一下。因?yàn)槊啃杏涗浂及粋€(gè)DropDownList,其數(shù)據(jù)源為CategoriesDataSource.每次登錄頁面時(shí),都會調(diào)用CategoriesBLL class類的GetCategories方法N次,這里N為GridView控件里行的數(shù)目.對GetCategories的N次調(diào)用就會導(dǎo)致對數(shù)據(jù)庫的N次查詢.我們可以對返回結(jié)果進(jìn)行緩存以減輕對數(shù)據(jù)庫造成的影響;至于方式嘛,可以運(yùn)用per-request caching策略,也可以在緩存層Caching Layer里使用SQL高速緩存依賴性(SQL caching dependency)或基于短時(shí)間緩存周期(a very short time-based expiry)的策略。對per-request caching策略的更多信息可參考文章《HttpContext.Items – a Per-Request Cache Store》(http://aspnet.4guysfromrolla.com/articles/060904-1.aspx)

第四步:完善編輯界面

  在瀏覽器里查看該頁面,就像圖13所示,每行都使用ItemTemplate模板,以包含其編輯頁面。


圖13:每個(gè)GridView Row都是可編輯的

  不過仍有一些問題。首先,UnitPrice值為四個(gè)小數(shù)點(diǎn),為此,返回UnitPrice TemplateField的ItemTemplate模板, 在TextBox的智能標(biāo)簽里點(diǎn)“Edit DataBindings”,然后,將Text屬性格式指定為number.


圖14:將Text格式指定為Number

  然后,將Discontinued列里的checkbox控件居中(而不是居左),在GridView的智能標(biāo)簽里點(diǎn)“編輯列”,選取左邊方框里的Discontinued,再在右邊方框里的ItemStyle里將HorizontalAlign屬性設(shè)置為Center,如圖15所示:


圖15:將Discontinued列里的CheckBox居左

  接下來在頁面上添加一個(gè)ValidationSummar控件,將其ShowMessageBox屬性設(shè)置為true;ShowSummary屬性設(shè)置為false. 同時(shí)再添加一個(gè)Button Web控件,用來更新用戶所做的更該。特別的,添加2個(gè),一個(gè)在GridView控件上面,一個(gè)在下面,將它們的Text屬性設(shè)置為“Update Products”.由于我們已經(jīng)在TemplateFields模板定義了編輯界面,那么EditItemTemplates模板就顯得多余了,將其刪除.

完成上述修改后,你的頁面聲明代碼看起來應(yīng)該和下面的差不多:

p>
 asp:Button ID="UpdateAllProducts1" runat="server" Text="Update Products" />
/p>
p>
 asp:GridView ID="ProductsGrid" runat="server" AutoGenerateColumns="False"
 DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
 AllowPaging="True" AllowSorting="True">
 Columns>
  asp:TemplateField HeaderText="Product" SortExpression="ProductName">
  ItemTemplate>
   asp:TextBox ID="ProductName" runat="server"
   Text='%# Bind("ProductName") %>'>/asp:TextBox>
   asp:RequiredFieldValidator ID="RequiredFieldValidator1"
   ControlToValidate="ProductName"
   ErrorMessage="You must provide the product's name."
   runat="server">*/asp:RequiredFieldValidator>
  /ItemTemplate>
  /asp:TemplateField>
  asp:TemplateField HeaderText="Category"
  SortExpression="CategoryName">
  ItemTemplate>
   asp:DropDownList ID="Categories" runat="server"
   AppendDataBoundItems="True"
   DataSourceID="CategoriesDataSource"
   DataTextField="CategoryName"
   DataValueField="CategoryID"
   SelectedValue='%# Bind("CategoryID") %>'>
   asp:ListItem>-- Select One --/asp:ListItem>
   /asp:DropDownList>
  /ItemTemplate>
  /asp:TemplateField>
  asp:TemplateField HeaderText="Price"
  SortExpression="UnitPrice">
  ItemTemplate>
   $asp:TextBox ID="UnitPrice" runat="server" Columns="8"
   Text='%# Bind("UnitPrice", "{0:N}") %>'>/asp:TextBox>
   asp:CompareValidator ID="CompareValidator1" runat="server"
   ControlToValidate="UnitPrice"
   ErrorMessage="You must enter a valid currency value.
     Please omit any currency symbols."
   Operator="GreaterThanEqual" Type="Currency"
   ValueToCompare="0">*/asp:CompareValidator>
  /ItemTemplate>
  /asp:TemplateField>
  asp:TemplateField HeaderText="Discontinued" SortExpression="Discontinued">
  ItemTemplate>
   asp:CheckBox ID="Discontinued" runat="server"
   Checked='%# Bind("Discontinued") %>' />
  /ItemTemplate>
  ItemStyle HorizontalAlign="Center" />
  /asp:TemplateField>
 /Columns>
 /asp:GridView>
/p>
p>
 asp:Button ID="UpdateAllProducts2" runat="server" Text="Update Products" />

 asp:ObjectDataSource ID="ProductsDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetProducts" TypeName="ProductsBLL">
 /asp:ObjectDataSource>

 asp:ObjectDataSource ID="CategoriesDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetCategories" TypeName="CategoriesBLL">
 /asp:ObjectDataSource>

 asp:ValidationSummary ID="ValidationSummary1" runat="server"
 ShowMessageBox="True" ShowSummary="False" />
/p>

當(dāng)添加Button Web控件并對相關(guān)格式進(jìn)行修改后,頁面如下圖所示:


圖16:頁面現(xiàn)在包含了2個(gè)“Update Products”按鈕

第五步:更新產(chǎn)品

  當(dāng)用戶登錄該頁面進(jìn)行修改時(shí)并點(diǎn)擊“Update Products”按鈕時(shí),我們需要將用戶輸入的值保存為一個(gè)ProductsDataTable instance實(shí)例;再將該實(shí)例傳遞給一個(gè)BLL method方法,進(jìn)而將該實(shí)例傳遞給DAL層的UpdateWithTransaction  method方法。該方法是在前面的文章里創(chuàng)建的,確保對批處理進(jìn)行原子操作.

在BatchUpdate.aspx.cs文件里創(chuàng)建一個(gè)名為BatchUpdate的方法,代碼如下:

private void BatchUpdate()
{
 // Enumerate the GridView's Rows collection and create a ProductRow
 ProductsBLL productsAPI = new ProductsBLL();
 Northwind.ProductsDataTable products = productsAPI.GetProducts();

 foreach (GridViewRow gvRow in ProductsGrid.Rows)
 {
 // Find the ProductsRow instance in products that maps to gvRow
 int productID = Convert.ToInt32(ProductsGrid.DataKeys[gvRow.RowIndex].Value);

 Northwind.ProductsRow product = products.FindByProductID(productID);
 if (product != null)
 {
  // Programmatically access the form field elements in the
  // current GridViewRow
  TextBox productName = (TextBox)gvRow.FindControl("ProductName");
  DropDownList categories =
  (DropDownList)gvRow.FindControl("Categories");
  TextBox unitPrice = (TextBox)gvRow.FindControl("UnitPrice");
  CheckBox discontinued =
  (CheckBox)gvRow.FindControl("Discontinued");

  // Assign the user-entered values to the current ProductRow
  product.ProductName = productName.Text.Trim();
  if (categories.SelectedIndex == 0)
  product.SetCategoryIDNull();
  else
  product.CategoryID = Convert.ToInt32(categories.SelectedValue);
  if (unitPrice.Text.Trim().Length == 0)
  product.SetUnitPriceNull();
  else
  product.UnitPrice = Convert.ToDecimal(unitPrice.Text);
  product.Discontinued = discontinued.Checked;
 }
 }

 // Now have the BLL update the products data using a transaction
 productsAPI.UpdateWithTransaction(products);
}

  該方法調(diào)用BLL層的GetProducts method方法,通過一個(gè)ProductsDataTable來獲取所有的產(chǎn)品.然后遍歷GridView控件的Rows collection集,該Rows collection集包含了GridView里每行所對應(yīng)的GridViewRow instance實(shí)例。由于GridView里每頁最多顯示了10行,所以GridView控件的Rows collection集包含的條碼最多不超過10條.

  每行記錄的ProductID來源于DataKeys collection集,并從ProductsDataTable里選出對應(yīng)的ProductsRow.這4個(gè)TemplateField input控件的值賦值給ProductsRow instance實(shí)例的屬性。當(dāng)對ProductsDataTable更新完成后,又轉(zhuǎn)到BLL業(yè)務(wù)邏輯層的UpdateWithTransaction method方法,就像我們在前面的教程看到的一樣,該方法僅僅調(diào)用DAL數(shù)據(jù)訪問層的UpdateWithTransaction方法.

  本文使用的批更新策略是:將ProductsDataTable里對應(yīng)于GridView里每行記錄的所有row進(jìn)行更新,不管用戶有沒有改動過產(chǎn)品信息.這種盲目的更改雖然執(zhí)行起來沒什么問題,但將會導(dǎo)致database table里出現(xiàn)多余的記錄.在前面的第37章《DataList批量更新》里,我們考察里DataList控件的批更新界面,在那篇文章里我們使用餓代碼只更新那些確實(shí)被用戶改動過的記錄.如果愿意的話,你可以使用37章的方法.
注意:當(dāng)通過GridView的智能標(biāo)簽來綁定數(shù)據(jù)源時(shí),Visual Studio會自動的將數(shù)據(jù)源的主鍵值指定為GridView的DataKeyNames屬性.如果你沒有通過GridView的智能標(biāo)簽來綁定ObjectDataSource的話,我們需要手工設(shè)置GridView控件DataKeyNames屬性為“ProductID”, 以便通過DataKeys collection集來訪問ProductID值.

  BatchUpdate方法里的代碼和BLL業(yè)務(wù)邏輯層里的UpdateProduct methods方法的代碼很相似,主要的區(qū)別在于UpdateProduct methods方法僅僅獲取一個(gè)單一的ProductRow instance實(shí)例.UpdateProducts methods方法里對ProductRow的屬性賦值的代碼與BatchUpdate方法里foreach循環(huán)里的代碼是一模一樣的.

  最后,當(dāng)點(diǎn)擊任意一個(gè)“Update Products”按鈕時(shí),將調(diào)用BatchUpdate方法,為這2個(gè)按鈕的Click events事件創(chuàng)建事件處理器,在里面添加如下的代碼:

BatchUpdate();

ClientScript.RegisterStartupScript(this.GetType(), "message",
 "alert('The products have been updated.');", true);

  以上代碼首先調(diào)用BatchUpdate()方法;再使用ClientScript property屬性來注入JavaScript,以顯示一個(gè)messagebox,提示“The products have been updated.”

  花幾分鐘測試代碼.在瀏覽器的登錄BatchUpdate.aspx頁面,編輯幾行記錄,點(diǎn)任意一個(gè)“Update Products”按鈕。假定輸入無誤,你會看到一個(gè)消息框顯示“The products have been updated.”為了測試原子操作,你可以任意添加一個(gè)CHECK約束,比如不接受UnitPrice的值為“1234.56”。然后再登錄BatchUpdate.aspx頁面,編輯幾行記錄,確保設(shè)置其中的一條記錄的UnitPrice值為“1234.56”. 當(dāng)點(diǎn)“Update Products”按鈕時(shí),將會出錯(cuò)。結(jié)果是所有的操作回滾,回到原來的值.

另一種可供選擇的BatchUpdate方法

  上面我們探討的BatchUpdate方法從BLL業(yè)務(wù)邏輯層的GetProducts方法獲取所有的產(chǎn)品.
如果GridView沒有啟用分頁的話,一切都很完美.如果啟用了分頁了呢?比如可能總共有幾百、幾千、幾萬條產(chǎn)品記錄,而GridView里每頁只顯示了10條記錄。在這種情況下,該方法獲取了所有的記錄,但只更新其中的10條記錄,實(shí)在是難稱完美.

面對這種情況,可以考慮使用下面的BatchUpdateAlternate代替:

private void BatchUpdateAlternate()
{
 // Enumerate the GridView's Rows collection and create a ProductRow
 ProductsBLL productsAPI = new ProductsBLL();
 Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();

 foreach (GridViewRow gvRow in ProductsGrid.Rows)
 {
 // Create a new ProductRow instance
 int productID = Convert.ToInt32(ProductsGrid.DataKeys[gvRow.RowIndex].Value);
 
 Northwind.ProductsDataTable currentProductDataTable =
  productsAPI.GetProductByProductID(productID);
 if (currentProductDataTable.Rows.Count > 0)
 {
  Northwind.ProductsRow product = currentProductDataTable[0];

  // Programmatically access the form field elements in the
  // current GridViewRow
  TextBox productName = (TextBox)gvRow.FindControl("ProductName");
  DropDownList categories =
  (DropDownList)gvRow.FindControl("Categories");
  TextBox unitPrice = (TextBox)gvRow.FindControl("UnitPrice");
  CheckBox discontinued =
  (CheckBox)gvRow.FindControl("Discontinued");

  // Assign the user-entered values to the current ProductRow
  product.ProductName = productName.Text.Trim();
  if (categories.SelectedIndex == 0)
  product.SetCategoryIDNull();
  else
  product.CategoryID = Convert.ToInt32(categories.SelectedValue);
  if (unitPrice.Text.Trim().Length == 0)
  product.SetUnitPriceNull();
  else
  product.UnitPrice = Convert.ToDecimal(unitPrice.Text);
  product.Discontinued = discontinued.Checked;

  // Import the ProductRow into the products DataTable
  products.ImportRow(product);
 }
 }

 // Now have the BLL update the products data using a transaction
 productsAPI.UpdateProductsWithTransaction(products);
}

  該方法首先創(chuàng)建一個(gè)名為products的空白的ProductsDataTable,再通過BLL業(yè)務(wù)邏輯層的GetProductByProductID(productID)方法來獲取具體的產(chǎn)品信息.獲取的ProductsRow instance實(shí)例更新其屬性,就像BatchUpdate()做的那樣。更新完后,通過ImportRow(DataRow)method方法將row導(dǎo)入名為products的ProductsDataTable.

  foreach循環(huán)完成后, products將包含那些對應(yīng)于GridView里每行記錄的ProductsRowinstance實(shí)例,由于這些實(shí)例是添加(而不是更新)到products,如果我們盲目的傳遞給UpdateWithTransaction method方法的話,ProductsTableAdatper會將每條記錄插入數(shù)據(jù)庫.在此,我們必須聲明只對這些行進(jìn)行更新(而不是添加).

  為此,我們需要在業(yè)務(wù)邏輯層里添加一個(gè)名為UpdateProductsWithTransaction的方法來達(dá)到上述目的。該方法,就像下面代碼顯示的那樣,將ProductsDataTable里的每一個(gè)ProductsRow instances實(shí)例的RowState設(shè)置為Modified,然后將該P(yáng)roductsDataTable傳遞給DAL數(shù)據(jù)訪問層的UpdateWithTransaction method方法.

public int UpdateProductsWithTransaction(Northwind.ProductsDataTable products)
{
 // Mark each product as Modified
 products.AcceptChanges();
 foreach (Northwind.ProductsRow product in products)
 product.SetModified();

 // Update the data via a transaction
 return UpdateWithTransaction(products);
}

總結(jié):

  GridView控件內(nèi)置的編輯功能只能對每行進(jìn)行編輯,對批編輯無能為力.就像本文探討的那樣,要創(chuàng)建一個(gè)批處理界面我們要多做一些工作。為此,我們需要將GridView里的列轉(zhuǎn)換為TemplateFields,并在ItemTemplates模板里定義編輯界面,另外要在頁面添加“Update All”按鈕,該按鈕與GridView彼此分開.該按鈕的Click event事件必須要確保遍歷GridView的Rows collection集、在一個(gè)ProductsDataTable里存儲改動信息,然后再傳遞給相應(yīng)的BLL業(yè)務(wù)邏輯層的方法.

  下一篇,我們將考察如何創(chuàng)建一個(gè)批刪除的界面,具體來說,每個(gè)GridView row都會包含一個(gè)checkbox。另外, 我們將用一個(gè)“Delete Selected Rows”按鈕來替換“Update All”按鈕.

  祝編程快樂!

作者簡介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創(chuàng)始人,自1998年以來一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對大家的學(xué)習(xí)ASP.NET有所幫助。

您可能感興趣的文章:
  • C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中
  • Asp.Net使用Bulk實(shí)現(xiàn)批量插入數(shù)據(jù)
  • C#/.Net 中快速批量給SQLite數(shù)據(jù)庫插入測試數(shù)據(jù)
  • asp.net新聞列表生成靜態(tài)頁之批量和單頁生成
  • 在ASP.NET 2.0中操作數(shù)據(jù)之六十四:GridView批量添加數(shù)據(jù)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之三十七:DataList批量更新
  • ajax readyState的五種狀態(tài)詳解
  • AJAX(XMLHttpRequest.status)狀態(tài)碼
  • javascript學(xué)習(xí)筆記(七)Ajax和Http狀態(tài)碼
  • asp.net線程批量導(dǎo)入數(shù)據(jù)時(shí)通過ajax獲取執(zhí)行狀態(tài)

標(biāo)簽:慶陽 臨夏 甘肅 中衛(wèi) 清遠(yuǎn) 海西 聊城

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在ASP.NET 2.0中操作數(shù)據(jù)之六十二:GridView批量更新數(shù)據(jù)》,本文關(guān)鍵詞  在,ASP.NET,2.0,中,操作,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數(shù)據(jù)之六十二:GridView批量更新數(shù)據(jù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于在ASP.NET 2.0中操作數(shù)據(jù)之六十二:GridView批量更新數(shù)據(jù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产美女明星三级做爰| 国产suv精品一区二区四区视频| 国产女同互慰高潮91漫画| 男人天堂网视频| 北条麻妃在线观看视频| 一二三四在线观看视频| 日韩av在线免费观看一区| 日韩欧美一级在线| www高清在线视频日韩欧美| 成人毛片100部免费看| www.亚洲色图.com| 那种视频在线观看| 欧美最猛黑人xxxxx猛交| 黄色录像特级片| 独立日3在线观看完整版| 91精品国产综合久久香蕉的特点| 在线视频国内自拍亚洲视频| 欧美黄色免费在线观看| 亚洲香蕉在线观看| 久久伊人成人网| 国产精品亚洲第一区在线暖暖韩国| 成人不卡视频| 欧美影院久久久| 人妻大战黑人白浆狂泄| 国产精品日韩av| 欧美成人免费播放| 欧美一区二区视频免费观看| 在线播放的av| 欧美精品免费视频| 欧美人与牲动交xxxxbbbb| 一区二区不卡在线视频 午夜欧美不卡在| 国产农村妇女毛片精品久久麻豆| 成人在线观看小视频| youjizz在线视频| 国产欧美日韩在线| 国产高潮失禁喷水爽到抽搐| 在线综合亚洲欧美在线视频| 欧美一级大片免费看| 激情六月婷婷久久| 国产精品xnxxcom| 日本午夜精华| 久久免费一级片| 夜夜未满十八勿进的爽爽影视| 午夜精品久久久久久| 欧美日韩中文字幕一区二区三区| 少妇又色又爽又黄的视频| 亚洲精品成人a在线观看| 国产精品狼人久久影院观看方式| 亚洲香蕉伊在人在线观| 在线亚洲+欧美+日本专区| 国产精品色婷婷视频| 亚洲欧美小说国产图片| 久久免费福利| 国内免费精品永久在线视频| 国产综合激情| 奇米影视888狠狠狠| 国产www视频在线观看| 日本a级片久久久| 国产精品白浆视频免费观看| 亚洲视频在线观看日本a| 亚洲 国产 欧美一区| 在线碰免费视频在线观看| 免费在线看黄色| 激情成人午夜视频| 国产99在线|中文| 国产亚洲观看| 中文字幕一区二区av| 96国产粉嫩美女| 这里有精品可以观看| 手机免费观看av| 中文字幕在线视频第一页| 国产在线精选视频| 久久久久久日本一区99| 中文字幕av一区 二区| av在线私库| 国产免费看av| 天堂av一区二区| 日本在线高清视频一区| 亚洲色图第四色| 国产人与禽zoz0性伦| 日韩电影免费| 欧美在线观看视频一区二区三区| 成人在线视频亚洲| 成人动漫视频在线观看完整版| 精品国偷自产国产一区| 午夜精品久久久99热福利| 欧美日韩美女一区二区| 色婷婷亚洲一区二区三区| 日本夜爽爽一二区| 国产一区二区三区在线视频观看| 精品久久久久久久中文字幕| 午夜精品久久久久久久无码| 国产精品免费一区二区三区观看| 国产精品丝袜一区二区三区| 亚洲综合成人av| 国产黄色小视频在线| 国产久一一精品| 中文一区一区三区免费在线观看| 99久久99热这里只有精品| 一区二区三区视频播放| 日韩精品免费视频| 中文在线资源新版官网| 成人性生交大片免费看网站| 日韩理论片网站| 亚洲日本在线播放| 久久国产精品久久国产精品| 亚洲精品成人久久久998| 国v精品久久久网| 色94色欧美sute亚洲线路一久| 99精品久久久久久中文字幕| 黄色录像特级片| 国产精品视频一区二区三区四区五区| 诱受h嗯啊巨肉高潮| 91精品国产经典在线观看| 国产爆乳无码一区二区麻豆| 中文字幕中文字幕精品| 亚洲天堂免费av| 91在线不卡| 一区二区成人在线视频| 18岁网站在线观看| a在线视频v视频| 97超碰免费在线观看| 欧洲av一区二区嗯嗯嗯啊| 中文字幕亚洲欧美在线| 亚洲国产综合视频在线观看| 成人免费在线视频| 欧美综合视频在线| 久草精品在线观看| 极品白嫩丰满美女无套| 亚洲精品国产电影| 日本少妇高潮喷水xxxxxxx| 国产xxxx做受性欧美88| 柠檬福利视频导航| 91精品国产成人| 欧美变态另类刺激| 欧美久久九九| 国产无一区二区| 精品一性一色一乱农村| 国产欧美日韩精品在线观看| 91精品一区二区三区综合在线爱| 国产精品视频久久一区| 欧美最猛性xxxxx亚洲精品| 欧美日韩在线观看成人| 82av视频| 狠狠色丁香婷综合久久| 你懂的视频网站| 国产麻豆久久| 亚洲精品国产欧美| 国产精品伦理久久久久久| 中文有码在线播放| 亚洲自拍中文字幕| 欧美sss在线视频| 中文字幕亚洲无线码在线一区| 久久av日韩| 欧美成人精品高清在线播放| 成年人福利视频| 成人国产免费电影| 欧洲在线一区| 亚洲成av人片在线观看无| 国产精品115| 国产日韩欧美电影在线观看| 国产成人一区| 老熟妇一区二区三区啪啪| 欧美孕妇与黑人孕交| 97视频免费在线观看| 黄色一区二区三区四区| 欧美日本视频在线| 国产成人精品一区二| 女女调教被c哭捆绑喷水百合| 欧美成人一区二区视频| 极品白嫩少妇无套内谢| 97久久人国产精品婷婷| 婷婷激情五月网| 欧美最猛性xxxxx亚洲精品| 国产欧美一区视频| 亚洲精品一区在线| 综合久草视频| 亚洲综合色激情五月| 国产精品久久国产精麻豆96堂| 精品久久久久久久久久久久久久久久| 久久久一区二区三区捆绑**| 欧美日韩中文字幕日韩欧美| 91亚洲国产成人精品一区二三| 中文字幕一区二区三区免费看| 国产综合色一区二区三区| 久久久久久久一区| 国产情侣自拍小视频| 国产最新网站| 日韩欧美第一区| 色呦呦在线免费观看| 国产精品久久激情| 精品在线欧美视频| 伊人久久大香线蕉综合影院首页| 欧美日韩国产综合视频在线观看| 久久中文字幕一区二区三区| 波多结衣在线观看| 日韩午夜黄色| 亚洲自拍小视频| 国产素人在线观看| 亚洲v日韩v欧美v综合| 亚洲电影在线| 国产小视频一区| 91porn在线| 国产剧情麻豆剧果冻传媒视频免费| 久久精品视频免费在线观看| 国产特级黄色片| 久久一区免费| 国产成人亚洲综合a∨婷婷| 欧美成人精品福利在线视频| 伦av综合一区| 伊人影院蕉久影院在线观看| 久久精品成人一区二区三区| 欧美亚洲国产日韩2020| 97影院理论片在线播放| 欧美在线免费| 久久国产在线观看| 亚洲色图狂野欧美| 国产成人精品一区二区三区在线观看| 美女免费免费看网站| 亚洲婷婷综合色高清在线| 久久久久亚洲蜜桃| 一级久久久久久久| 黄色毛片免费看| 色爱区综合激月婷婷| 99久久综合99久久综合网站| 中文字幕日韩欧美精品在线观看| 国产精品美女av| 小说区图片区色综合区| 懂色中文一区二区三区在线视频| 夜夜未满十八勿进的爽爽影视| 成人激情视频在线观看| 中文字幕永久视频| 欧美国产97人人爽人人喊| 日韩一级在线播放| 久久精品亚洲麻豆av一区二区| 日本aⅴ精品一区二区三区| 欧美午夜a级限制福利片| 综合毛片免费视频| 性一交一乱一伦一色一情| 亚洲一区二区三区成人在线视频精品| 国产精品免费看久久久香蕉| 日本免费一区二区视频| 亚洲AV无码国产精品| 欧美久久精品一级c片| 一区二区三区中文字幕在线观看| 男人在线观看视频| 精品中文字幕久久久久久| 视频一区二区在线播放| 国产一级中文字幕| 伊人青青综合网站| 日韩欧美大片在线观看| 国产美女高潮久久白浆| 精品一二三四在线| 国产伦精品一区三区精东| 91精品久久久久久久蜜月| 国产精品va无码一区二区三区| 动漫性做爰视频| 乱精品一区字幕二区| 国产高清精品网站| 国产精品日本| 久久亚洲AV无码专区成人国产| 美女高潮视频在线看| 国产无人区码熟妇毛片多| 日韩视频一区| 欧美黄色大片网站| 虎白女粉嫩尤物福利视频| 2021av天天| 日本va欧美va欧美va精品| 中文字幕资源网在线观看| 超碰免费在线公开| 色五月激情五月| 老熟妇高潮一区二区高清视频| 亚洲精品亚洲人成人网在线播放| 国产精品欧美一区喷水| 99热播在线观看| 成人高清免费观看| 国产精品视频123| 国产精品一区二区免费不卡| 精品一区精品二区| 亚洲欧美日本视频在线观看| 精品3atv在线视频| 亚洲蜜桃精久久久久久久久久久久| 国产精品免费一区二区三区四区| 国产精品免费观看久久| 激情国产一区| 六月婷婷中文字幕| 久久91超碰青草是什么| 国产精品美女一区二区在线观看| 国产精品91在线| 国产视频网站在线| 一本一本久久a久久综合精品| 久久er99热精品一区二区三区| 成人午夜免费av| 91在线视频播放| 韩国xxxx做受gayxxxx| av一级在线观看| 亚洲第一会所001| 91精品国产综合久久香蕉的特点| av地址在线观看| 国产一区二区三区欧美| 超碰99在线| 91久久久久久久| 动漫精品一区二区| 亚洲少妇第一页| 午夜宅男久久久| 国产乱子伦精品无码码专区| 欧美性猛交xx乱大交| 日韩成人av一区二区| 欧美另类色图| 亚洲精品国产成人久久av盗摄| julia中文字幕一区二区99在线| 国产成人无遮挡在线视频| 免费网站黄在线观看| 我要看一级黄色录像| 亚洲欧美日韩国产成人综合一二三区| 懂色av一区二区三区在线播放| 不卡的av电影在线观看| 色综合www| 91香蕉视频在线播放| 国产美女自拍视频| 两个人免费视频观看日本| 亚洲欧美日韩电影| 欧美精品手机在线| 日韩美女精品| 四虎影在永久在线观看| 日韩视频欧美视频| 日韩av黄色在线观看| 欧美性xxxx极品hd欧美|