婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 在ASP.NET 2.0中操作數據之三十七:DataList批量更新

在ASP.NET 2.0中操作數據之三十七:DataList批量更新

熱門標簽:百應電話機器人外呼系統 400電話辦理怎么樣 聯通官網400電話辦理 臨沂智能電話機器人加盟 西寧呼叫中心外呼系統線路商 外呼電話機器人成本 網絡電話外呼系統上海 蘇州如何辦理400電話 地圖標注軟件免費下載

導言

  在前面我們學習了如何創建item級的DataList。和可編輯的GridView一樣,每個DataList里的item都包含一個Edit button,當點擊時,item會變的可編輯。item級的編輯在偶爾需要更新時沒什么問題,但是在有些情況下用戶需要編輯大量的記錄。如果一個用戶需要編輯許多記錄,他會被迫去不停的去點擊Edit,作出修改,然后點擊Update,這些大量的點擊會妨礙他的工作效率。在這樣的情況下,一個好的選擇是提供一個完全可編輯的DataList,它的所有的item都處于編輯模式下,它的所有的值都可以通過點擊一個“Update All”button來更新。見圖1。


圖 1: 一個完全可編輯的DataList 的所有item都可以被修改

  本章我們來學習如何創建一個完全可編輯的DataList,它提供用戶更新supplier的address的功能。

第一步: 在DataList的 ItemTemplate創建一個可編輯的用戶界面

在前面創建一個標準的item級編輯的DataList時,我們使用了兩個template:

ItemTemplate — 包含只讀的用戶界面(使用 Label 顯示每個product的 name 和price).
EditItemTemplate — 包含編輯的用戶界面(兩個TextBox ).

  DataList的EditItemIndex屬性表明了哪個DataListItem使用EditItemTemplate來展示(如果有的話)。即ItemIndex的值等于DataList的EditItemIndex的DataListItem使用EditItemTemplate來展示。在一次只編輯一個item的情況下,這個模式工作的很好,但是在創建完全可編輯的DataList的時候就不適用了。

  對完全可編輯的DataList來說,我們需要所有的DataListItem都以可編輯的界面來展示。最簡單的方法是在ItemTemplate里定義可編輯的界面。對修改supplier的address信息而言,可編輯界面里supplier表現為文本,address,city和country的值都用TextBox來表示。

  首先打開BatchUpdate.aspx頁,添加一個DataList,將ID設為Suppliers。通過智能標簽添加一個名為SuppliersDataSource的ObjectDataSource控件。


圖2: 創建一個名為SuppliersDataSource的ObjectDataSource

使用SuppliersBLL類的GetSuppliers()方法配置ObjectDataSource(見圖3)。象前面一章那樣,我們將直接使用 BLL而不是通過ObjectDataSource來更新supplier信息。在UPDATE標簽里選擇None(見圖4)。


圖 3: 使用GetSuppliers() 方法配置ObjectDataSource


圖 4: 設置UPDATE 標簽為None

  完成向導后,Visual Studio會自動生成DataList的ItemTemplate來在Label里顯示每個數據字段。我們需要修改這個template讓它提供編輯界面。ItemTemplate可以在設計器里通過DataList的智能標簽上的Edit Templates或直接寫聲明語法來自定義。

  創建一個編輯界面,將supplier的name表現為文本,address,city和country表現為TextBox。完成這些后,你的聲明代碼應該和下面差不多:

asp:DataList ID="Suppliers" runat="server" DataKeyField="SupplierID"
 DataSourceID="SuppliersDataSource">
 ItemTemplate>
  h4>asp:Label ID="CompanyNameLabel" runat="server"
   Text='%# Eval("CompanyName") %>' />/h4>
  table border="0">
   tr>
    td class="SupplierPropertyLabel">Address:/td>
    td class="SupplierPropertyValue">
     asp:TextBox ID="Address" runat="server"
      Text='%# Eval("Address") %>' />
    /td>
   /tr>
   tr>
    td class="SupplierPropertyLabel">City:/td>
    td class="SupplierPropertyValue">
     asp:TextBox ID="City" runat="server"
      Text='%# Eval("City") %>' />
    /td>
   /tr>
   tr>
    td class="SupplierPropertyLabel">Country:/td>
    td class="SupplierPropertyValue">
     asp:TextBox ID="Country" runat="server"
      Text='%# Eval("Country") %>' />
    /td>
   /tr>
  /table>
  br />
 /ItemTemplate>
/asp:DataList>
asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
 OldValuesParameterFormatString="original_{0}"
 SelectMethod="GetSuppliers" TypeName="SuppliersBLL">
/asp:ObjectDataSource>

  注意:和前面一章一樣,需要為DataList開啟view state。

  在ItemTemplate里我使用了兩個新的CSS類,SupplierPropertyLabel和SupplierPropertyValue。它們的風格設置和ProductsPropertyLabel和ProductPropertyValue CSS類一樣,并已經加入到Styles.css中。

.ProductPropertyLabel, .SupplierPropertyLabel
{
 font-weight: bold;
 text-align: right;
}
.ProductPropertyValue, .SupplierPropertyValue
{
 padding-right: 35px;
}

完成這些后瀏覽頁面。如圖5所示,每個DataList的item用文本顯示supplier name,用TextBox顯示address,city和country。


圖 5:  DataList里的每個Supplier都可編輯

第二步: 增加“Update All” Button

  圖5里顯示的信息暫時還沒提供Update按鈕。完全可編輯的DataList應該只包含一個"Update All"按鈕,而不是象前面那樣,每個item包含一個button。當點擊"Update All"時,DataList里的所有記錄將被更新。本章我們將添加兩個"Update All"button- 一個在頁的上面,一個在下面(兩個都提供相同的功能)。

  先在DataList上面添加一個ID為UpdateAll1的Button。然后在DataList下面添加ID為UpdataAll2的Button。兩個Button的Text都設為"Update All"。最后為兩個Button的Click事件都創建一個event handler。我們創建一個方法,“UpdateAllSupplierAddress”,然后在事件處理中調用它。(而不是在兩個事件處理里復制相同的代碼)

protected void UpdateAll1_Click(object sender, EventArgs e)
{
 UpdateAllSupplierAddresses();
}
protected void UpdateAll2_Click(object sender, EventArgs e)
{
 UpdateAllSupplierAddresses();
}
private void UpdateAllSupplierAddresses()
{
 // TODO: Write code to update _all_ of the supplier addresses in the DataList
}

圖6是添加完"Update All"button后的頁面。


圖 6: 頁面添加了兩個“Update All” Button

第三步: 更新所有的Suppliers的 Address 信息

  完成了將所有的item顯示為可編輯的界面和添加了“Update All”button后,剩下的事就是寫代碼執行批量更新。我們需要便利DataList的item,調用SuppliersBLL類的UpdateSupplierAddress方法。

  可以通過DataList的Items property 來訪問DataListItem集合。通過DataListItem的引用,我們可以從DataKeys集合里獲取相關的SuppliserID,并引用ItemTemplate里的TextBox,見下面的代碼:

private void UpdateAllSupplierAddresses()
{
 // Create an instance of the SuppliersBLL class
 SuppliersBLL suppliersAPI = new SuppliersBLL();
 // Iterate through the DataList's items
 foreach (DataListItem item in Suppliers.Items)
 {
  // Get the supplierID from the DataKeys collection
  int supplierID = Convert.ToInt32(Suppliers.DataKeys[item.ItemIndex]);
  // Read in the user-entered values
  TextBox address = (TextBox)item.FindControl("Address");
  TextBox city = (TextBox)item.FindControl("City");
  TextBox country = (TextBox)item.FindControl("Country");
  string addressValue = null, cityValue = null, countryValue = null;
  if (address.Text.Trim().Length > 0)
   addressValue = address.Text.Trim();
  if (city.Text.Trim().Length > 0)
    cityValue = city.Text.Trim();
  if (country.Text.Trim().Length > 0)
   countryValue = country.Text.Trim();
  // Call the SuppliersBLL class's UpdateSupplierAddress method
  suppliersAPI.UpdateSupplierAddress
   (supplierID, addressValue, cityValue, countryValue);
 }
}

  當用戶點擊一個"Update All"button時,每個Supplier DataList里的DataListItem都執行UpdateAllSupplierAddress方法,并調用SuppliersBLL類的UpdateSupplierAddress方法,將相關的值傳過去。如果address,city或country里不輸入值,UpdateSupplierAddress會接收一個空值(不是空字符串),而相關的字段的結果會是一個database NULL。

  注意:你可以添加一個顯示的狀態Label,當批量更新完成后通過它來提供一些確認信息。只更新 Addresses被修改過的記錄

  本章使用的批量更新法則為每個DataList里的supplier調用UpdateSupplierAddress方法,無論address信息是否被修改過。雖然這種盲目的更新一般情況下不會有什么性能問題,但是如果你有做數據庫表的審計,那樣將會導致很多多余的記錄。每次用戶點擊"Update All"button后,不管用戶是否有修改,系統里都會為每個supplier產生一個一條新的審計記錄。

  ADO.NET的DateTable和DataAdapter類被設計用來支持批量更新那些僅僅被修改,刪除或新增的記錄。DataTable的每個row都有RowState property 來指明這個row是否是新增到DataTable或從它里面刪除,修改,或沒有改變。當DataTable剛產生時,所有的row都被標記為未修改的,修改了row的任何列后row會被標記為已修改的。

  在SuppliersBLL類里我們首先將supplier的記錄讀進SuppliersDataTable里然后設置Address,City和Country列的值來更新指定的supplier的信息,見以下代碼:

public bool UpdateSupplierAddress
 (int supplierID, string address, string city, string country)
{
 Northwind.SuppliersDataTable suppliers =
  Adapter.GetSupplierBySupplierID(supplierID);
 if (suppliers.Count == 0)
  // no matching record found, return false
  return false;
 else
 {
  Northwind.SuppliersRow supplier = suppliers[0];
  if (address == null)
   supplier.SetAddressNull();
  else
   supplier.Address = address;
  if (city == null)
   supplier.SetCityNull();
  else
   supplier.City = city;
  if (country == null)
   supplier.SetCountryNull();
  else
   supplier.Country = country;
  // Update the supplier Address-related information
  int rowsAffected = Adapter.Update(supplier);
  // Return true if precisely one row was updated,
  // otherwise false
  return rowsAffected == 1;
 }
}

  無論值是否有被修改,這段代碼都將傳入的address,city和country的值賦給SuppliersDataTable的SuppliersRow。這個修改將使SuppliersRow的RowState屬性被標記為已修改的。當DAL的Update方法被調用時,它發現SupplierRow已經被修改了,因此向數據庫發送UPDATE命令。

  然而想象一下,我們為這個方法添加的代碼僅僅在和已經存在的值不一樣時才將傳入的address,city和country的值賦給SuppliersRow。在address,city和country沒有修改的情況下,SupplierRow的RowState仍然標記為未改變。這樣的結果是當DAL的Update方法被調用時,SuppliersRow沒有被修改,因此不會調用數據庫。使用以下的代碼代替前面盲目的賦值:

// Only assign the values to the SupplierRow's column values if they differ
if (address == null  !supplier.IsAddressNull())
 supplier.SetAddressNull();
else if ((address != null  supplier.IsAddressNull()) ||
   (!supplier.IsAddressNull() 
   string.Compare(supplier.Address, address) != 0))
 supplier.Address = address;
if (city == null  !supplier.IsCityNull())
 supplier.SetCityNull();
else if ((city != null  supplier.IsCityNull()) ||
   (!supplier.IsCityNull()  string.Compare(supplier.City, city) != 0))
 supplier.City = city;
if (country == null  !supplier.IsCountryNull())
 supplier.SetCountryNull();
else if ((country != null  supplier.IsCountryNull()) ||
   (!supplier.IsCountryNull() 
   string.Compare(supplier.Country, country) != 0))
 supplier.Country = country; 

增加了這些代碼后,DAL的Update方法僅僅在更改過address相關的值的那些記錄里才向數據庫發送UPDATE命令。

  當然我們也可以追蹤傳入的字段和數據庫數據是否有區別,如果沒有,就不需要調用DAL的Update方法。這種方法在你使用直接的數據庫命令時非常有效,因為直接的數據庫命令不會檢查SuppliersRow來決定是否需要調用數據庫。

  注意:每次UpdateSupplierAddress方法被調用時,都會調用一次數據庫來獲取需要更新的記錄的信息。如果數據被修改,又要調用一次數據庫來更新數據。這個流程可以通過創建一個重載的UpdateSupplierAddress方法來優化,這個方法接受一個EmployeesDataTable ,它包含BatchUpdate.aspx頁的所有的修改。然后它會調用一次數據庫來獲取Suppliers表里的所有記錄。在結果集里僅僅是被修改過的記錄才能被更新。

總結

  本章學習了如何創建一個完全可編輯的DataList。通過它用戶可以快速的修改多個supplier的address信息。我們首先定義了編輯界面 — address,city和country都以TextBox來表示 — 在DataList的ItemTemplate里。然后我們在DataList的上下各添加了一個“Update All”button。用戶修改完后,點擊其中一個后,每個DataListItem都會調用SuppliersBLL類的UpdateSupplierAddress方法。

  祝編程愉快!

作者簡介

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

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

標簽:中衛 慶陽 清遠 平涼 甘肅 海西 聊城 臨夏

巨人網絡通訊聲明:本文標題《在ASP.NET 2.0中操作數據之三十七:DataList批量更新》,本文關鍵詞  在,ASP.NET,2.0,中,操作,數據,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數據之三十七:DataList批量更新》相關的同類信息!
  • 本頁收集關于在ASP.NET 2.0中操作數據之三十七:DataList批量更新的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日韩精品一区二区三区在线 | 欧美一区二区日韩一区二区| 精品中文字幕一区二区| 亚洲欧洲韩国日本视频| 91精品国产综合久久国产大片| 成人av免费网站| 麻豆精品新av中文字幕| 香蕉成人啪国产精品视频综合网| 欧美变态tickle挠乳网站| 91色porny| 岛国精品在线播放| 国模大尺度一区二区三区| 成人激情午夜影院| 综合色天天鬼久久鬼色| 亚洲三级久久久| 亚洲欧洲成人自拍| 国产精品精品国产色婷婷| 精品99一区二区三区| 欧美精品第一页| 色综合中文字幕国产| 成人永久免费视频| 美女精品自拍一二三四| 久久99热这里只有精品| 日本欧洲一区二区| 亚洲与欧洲av电影| 亚洲视频免费观看| 一区二区三区欧美亚洲| 亚洲视频一区在线观看| 亚洲图片自拍偷拍| 午夜电影网一区| 美女视频黄频大全不卡视频在线播放| 香蕉久久夜色精品国产使用方法 | 夜夜精品浪潮av一区二区三区| 久久九九久精品国产免费直播| 久久婷婷成人综合色| 久久免费国产精品| 亚洲三级免费观看| 亚洲九九爱视频| 舔着乳尖日韩一区| 美国十次综合导航| 国产mv日韩mv欧美| 91色porny| 欧美一区二区三区的| 精品久久久久久久久久久院品网 | 国产精品一区二区在线观看不卡| 国产综合色视频| 9i看片成人免费高清| 日本久久电影网| 精品国产一区二区三区不卡 | 日韩欧美一级二级三级| 国产欧美日韩视频在线观看| 亚洲精品少妇30p| 午夜成人在线视频| 国产91在线观看丝袜| 欧美性高清videossexo| 精品国产一二三区| 综合久久一区二区三区| 日本不卡中文字幕| 成人av在线播放网站| 日韩免费视频一区二区| 中文字幕高清一区| 亚洲成人一区二区在线观看| 国产一区二区三区蝌蚪| 色狠狠一区二区三区香蕉| 久久天天做天天爱综合色| 亚洲免费av在线| 福利电影一区二区三区| 欧美酷刑日本凌虐凌虐| 国产精品久久久久久亚洲伦 | 欧美一区二区免费观在线| 国产精品久久精品日日| 石原莉奈在线亚洲三区| 97国产精品videossex| 欧美成人一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 三级不卡在线观看| 91年精品国产| 国产精品免费视频一区| 久久国产剧场电影| 69堂国产成人免费视频| 亚洲精品日韩综合观看成人91| 成人精品高清在线| 久久久久久黄色| 毛片不卡一区二区| 欧美美女黄视频| 国产馆精品极品| 精品国产乱码久久久久久1区2区 | 白白色 亚洲乱淫| 国产欧美精品区一区二区三区 | 国产激情精品久久久第一区二区| 欧美日韩极品在线观看一区| 亚洲欧洲制服丝袜| av福利精品导航| 国产精品久久二区二区| 国产成人精品综合在线观看| 久久亚洲精品小早川怜子| 免费视频最近日韩| 欧美三级三级三级| 最新不卡av在线| 91蝌蚪国产九色| 亚洲主播在线观看| 91蜜桃视频在线| 亚洲h动漫在线| 欧美体内she精视频| 亚洲一区二区三区精品在线| 91麻豆.com| 亚洲乱码中文字幕| 在线欧美日韩精品| 亚洲影视在线播放| 宅男在线国产精品| 日韩综合一区二区| 欧美精品一区二区在线播放| 国产又粗又猛又爽又黄91精品| 亚洲国产成人av| 欧美亚洲图片小说| 轻轻草成人在线| 精品美女一区二区| 波多野结衣中文字幕一区| 亚洲男人都懂的| 欧美理论片在线| 国产一二精品视频| 最好看的中文字幕久久| 色婷婷激情一区二区三区| 亚洲午夜久久久久中文字幕久| 欧美视频日韩视频在线观看| 裸体健美xxxx欧美裸体表演| 亚洲精品一区二区在线观看| jizz一区二区| 奇米影视一区二区三区| 国产欧美一区视频| 69堂精品视频| 国产精品综合二区| 午夜精品影院在线观看| 日韩欧美国产午夜精品| av在线不卡网| 亚洲成av人片在线观看无码| 日韩一本二本av| jlzzjlzz国产精品久久| 婷婷激情综合网| 久久只精品国产| 6080国产精品一区二区| 免费成人美女在线观看.| 国产精品美女一区二区三区| 欧美日韩色一区| 国产成人99久久亚洲综合精品| 亚洲日本免费电影| 日韩欧美亚洲另类制服综合在线| 91片在线免费观看| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲综合清纯丝袜自拍| 精品国产伦一区二区三区观看方式 | av电影在线观看一区| 一区二区三区在线影院| 日韩欧美国产小视频| 欧美在线免费播放| 国产成人综合网站| 美女精品一区二区| 一区二区高清视频在线观看| 国产精品毛片无遮挡高清| 制服丝袜日韩国产| 欧美午夜在线一二页| 国产成人在线观看| 激情图片小说一区| 亚洲成人激情自拍| 亚洲日本中文字幕区| 久久精品夜色噜噜亚洲aⅴ| 日韩一区二区三区四区| 色综合久久六月婷婷中文字幕| 国产精品一区二区男女羞羞无遮挡 | 国产麻豆视频一区| 日本一区中文字幕| 亚洲一区二区三区爽爽爽爽爽| 国产欧美久久久精品影院| 久久女同互慰一区二区三区| 日韩精品一区二区三区中文精品| 日韩一区和二区| 欧美狂野另类xxxxoooo| 国产女人18毛片水真多成人如厕 | 久久婷婷综合激情| 久久综合九色综合欧美98| 欧美电影一区二区三区| 91精品国产综合久久精品| 欧美色图免费看| 欧美精品久久99| 欧美福利一区二区| 欧美一级日韩免费不卡| 欧美区一区二区三区| 欧美一区二区福利在线| 4438成人网| 日韩一区二区三区精品视频| 欧美一区二区三区四区高清 | 久久久夜色精品亚洲| 久久精品亚洲一区二区三区浴池 | 一区二区三区在线影院| 一区二区三区四区精品在线视频| 国产精品久久久久久久第一福利| 亚洲免费视频中文字幕| 亚洲综合清纯丝袜自拍| 蜜桃精品视频在线观看| 国产尤物一区二区在线|