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

主頁(yè) > 知識(shí)庫(kù) > 在ASP.NET 2.0中操作數(shù)據(jù)之十七:研究插入、更新和刪除的關(guān)聯(lián)事件

在ASP.NET 2.0中操作數(shù)據(jù)之十七:研究插入、更新和刪除的關(guān)聯(lián)事件

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

導(dǎo)言

  當(dāng)使用GridView、DetailsView或FormView控件的內(nèi)建插入、編輯或刪除特征時(shí),在用戶添加一條新記錄或更新/刪除一條現(xiàn)在記錄的過(guò)程中發(fā)生了多個(gè)步驟。正如我們之前一節(jié)里所討論的,在GridView中編輯一行時(shí),保存(Update)和取消(Cancel)按鈕將取代編輯(Edit)按鈕,并且綁定列轉(zhuǎn)換成TextBox。在用戶更新了數(shù)據(jù)并點(diǎn)擊保存按鈕之后,下述步驟在回傳時(shí)執(zhí)行:

1.該GridView控件根據(jù)當(dāng)前編輯行的唯一標(biāo)識(shí)字段(通過(guò)DataKeyNames屬性)組裝它的ObjectDataSource的UpdateParameters參數(shù),連同用戶輸入的值

2.該GridView控件調(diào)用它的ObjectDataSource的Update()方法,它轉(zhuǎn)而調(diào)用潛在對(duì)象的適當(dāng)?shù)姆椒ǎ≒roductsDAL.UpdateProduct,我們之前一節(jié)里)

3.現(xiàn)在,這些隱含的數(shù)據(jù),包含保存后的更改,被重新綁定到GridView控件

  在這一連串的步驟里,觸發(fā)了許多事件,這讓我們可以創(chuàng)建事件處理程序從而在需要的地方增加自定義邏輯。例如,在第1步之前,觸發(fā)GridView的事件。在這里,如果有什么validation錯(cuò)誤我們可以取消更新請(qǐng)求。當(dāng)調(diào)用Update()方法時(shí),觸發(fā)ObjectDataSource的Updating事件,提供了增加或自定義UpdateParameters的值的機(jī)會(huì)。在ObjectDataSource的潛在對(duì)象的方法完全執(zhí)行后,觸發(fā)ObjectDataSource的Updated事件。針對(duì)Updated事件的事件處理程序可以檢查更新操作的相關(guān)詳細(xì)信息,例如影響了多少行數(shù)據(jù),或者是否引發(fā)了一個(gè)異常。最后,在第2步之后,GridView的RowUpdated事件觸發(fā);針對(duì)此事件的事件處理程序可以檢查關(guān)于剛剛完成的更新操作的相關(guān)額外信息。

  圖1描述了使用GridView更新時(shí)這一系列連續(xù)的事件和步驟。圖1里的這個(gè)事件模式不僅是在GridView的更新操作。從GridView、DetailsView或者FormView里插入、更新或者刪除數(shù)據(jù)時(shí),數(shù)據(jù)Web服務(wù)器控件和ObjectDataSource都會(huì)發(fā)生這一連串的pre-level和post-level的事件。

圖1: 當(dāng)在GridView里更新數(shù)據(jù)時(shí),觸發(fā)一連串的Pre-和Post-事件

  在這一節(jié)里,我們將探討使用這些事件從而擴(kuò)展ASP.NET數(shù)據(jù)Web服務(wù)器控件的內(nèi)建插入、更新和刪除功能。我們也會(huì)看看如何自定義編輯界面從而僅僅更新部分產(chǎn)品字段。

第一步: 更新產(chǎn)品的ProductName和UnitPrice字段

  在之前一節(jié)的編輯界面里,包含了產(chǎn)品的所有字段并且它們都不是只讀的。如果我們從GridView中剔除一列(QuantityPerUnit),那么當(dāng)更新時(shí)數(shù)據(jù)Web服務(wù)器控件就不會(huì)設(shè)置ObjectDataSource的QuantityPerUnit UpdateParameters的值。ObjectDataSource則傳入一個(gè)null值到UpdateProduct這個(gè)業(yè)務(wù)邏輯層的方法,它將當(dāng)前編輯的數(shù)據(jù)庫(kù)記錄的QuantityPerUnit字段更改為值。同樣地,如果是一個(gè)必需的字段,例如ProductName,如果從編輯界面中剔除了,那么此更新將會(huì)失敗并拋出一個(gè)“Column 'ProductName' does not allow nulls”異常。導(dǎo)致這一現(xiàn)象的原因是ObjectDataSource被配置為調(diào)用ProductsBLL類的UpdateProduct方法,它預(yù)期每一個(gè)產(chǎn)品字段都對(duì)應(yīng)一個(gè)輸入?yún)?shù)。因此,ObjectDataSource的UpdateParameters集合包含了該方法的每一個(gè)輸入?yún)?shù)。

  如果我們希望提供一個(gè)允許最終用戶僅僅可以更新部分字段的數(shù)據(jù)Web服務(wù)器控件,那么我們需要在ObjectDataSource的Updating事件處理程序中編程設(shè)置缺失的UpdateParameters值,或者創(chuàng)建并調(diào)用一個(gè)預(yù)期部分字段的BLL方法。讓我們?cè)诮酉聛?lái)的步驟中探討。

  特別地,讓我們創(chuàng)建一個(gè)在一個(gè)可編輯的GridView中僅顯示ProductName和UnitPrice字段的頁(yè)面。這個(gè)GridView的編輯界面將僅僅允許用戶更新兩個(gè)顯示的字段,ProductName和UnitPrice 。因?yàn)檫@個(gè)編輯界面僅僅提供產(chǎn)品的部分字段,我們需要?jiǎng)?chuàng)建一個(gè)ObjectDataSource,它使用現(xiàn)有的BLL的UpdateProduct方法并在Updating事件處理程序中編程設(shè)置產(chǎn)品的缺少的字段的值,或者我們需要?jiǎng)?chuàng)建一個(gè)新的BLL方法,它僅接受那些在GridView中已經(jīng)定義的部分字段。在這一節(jié)里,我們使用后者,創(chuàng)建一個(gè)UpdateProduct方法的重載,它提取3個(gè)輸入?yún)?shù):productName、unitPrice和productID:

[System.ComponentModel.DataObjectMethodAttribute
  (System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, 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 (unitPrice == null) product.SetUnitPriceNull();
   else product.UnitPrice = unitPrice.Value;

  // Update the product record
  int rowsAffected = Adapter.Update(product);

  // Return true if precisely one row was updated, otherwise false
  return rowsAffected == 1;
}

  跟原有的UpdateProduct方法類似,這個(gè)重載方法首先檢查是否在數(shù)據(jù)庫(kù)中存在一個(gè)指定ProductID的產(chǎn)品。如果不存在,它返回false,指示更新產(chǎn)品信息的請(qǐng)求失敗。否則,它因而更新現(xiàn)存的產(chǎn)品記錄的ProductName和UnitPrice字段并通過(guò)調(diào)用TableAdapter的Update()方法提交此更新,傳入ProductsRow實(shí)例。

  通過(guò)這些對(duì)我們的ProductsBLL類的額外處理,我們現(xiàn)在可以創(chuàng)建一個(gè)簡(jiǎn)單GridView界面。打開(kāi)EditInsertDelete文件夾中的DataModificationEvents.aspx ,添加一個(gè)GridView控件到頁(yè)面。新建一個(gè)ObjectDataSource并配置它使用ProductsBLL類,它的Select()方法映射到GetProducts ,Update()方法映射到僅接受productName、unitPrice和productID輸入?yún)?shù)的UpdateProduct方法重載。圖2展示了映射ObjectDataSource的Update()方法到ProductsBLL類的新的UpdateProduct方法重載時(shí)的數(shù)據(jù)源配置向?qū)А?/p>

圖 2: 映射ObjectDataSource的Update()方法到新的UpdateProduct重載

  因?yàn)槲覀兊睦訉H僅需要編輯數(shù)據(jù)的能力,不需要插入或刪除記錄,那么花些時(shí)間明確地指明該ObjectDataSource的Insert()和Delete()方法不會(huì)映射到ProductsBLL類的任何方法--通過(guò)到INSERT和DELETE的tab頁(yè)并從下拉列表中選擇(無(wú))。

圖 3: 在INSERT和DELETE的Tab頁(yè),從下拉列表中選擇(無(wú))

完成了此向?qū)Ш?,從GridView的職能標(biāo)記里勾選上啟用編輯。

完成了此數(shù)據(jù)源配置向?qū)Р⒔壎ǖ紾ridView后,Visual Staudio就已經(jīng)添加好它們的聲明語(yǔ)法。到源視圖察看該ObjectDataSource的聲明標(biāo)記,它將如下所示:

[System.ComponentModel.DataObjectMethodAttribute
  (System.ComponentModel.DataObjectMethodType.Update, false)]
public bool UpdateProduct(string productName, decimal? unitPrice, 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 (unitPrice == null) product.SetUnitPriceNull();
   else product.UnitPrice = unitPrice.Value;

  // Update the product record
  int rowsAffected = Adapter.Update(product);

  // Return true if precisely one row was updated, otherwise false
  return rowsAffected == 1;
}

  因?yàn)镺bjectDataSource的Insert()和Delete()方法沒(méi)有映射,也就沒(méi)有InsertParameters或者DeleteParameters片段。此外,因?yàn)榉椒ㄓ成涞経pdateProduct方法重載,它僅接受3個(gè)輸入?yún)?shù),UpdateParameters片段也就僅包含3個(gè)Parameter實(shí)例。

  注意到ObjectDataSource的屬性被設(shè)置為original_{0}。這個(gè)屬性是使用數(shù)據(jù)源配置向?qū)r(shí)Visual Studio自動(dòng)設(shè)置的。因此,由于我們的BLL方法不需要傳入原始的ProductID值,從ObjectDataSource的聲明語(yǔ)法中刪除所有這些屬性設(shè)置。

  注意: If you如果你只是簡(jiǎn)單地在設(shè)計(jì)視圖里從屬性窗口清除OldValuesParameterFormatString屬性的值,這個(gè)屬性會(huì)依舊存在于聲明語(yǔ)法里,但會(huì)被設(shè)置為一個(gè)空字符串。要么從聲明語(yǔ)法里把該屬性通通刪掉,要么從屬性窗口,設(shè)置它的值為默認(rèn)值:{0} 。

雖然ObjectDataSource僅僅包含對(duì)productName、unitPrice和productID的UpdateParameters,Visual Studio還是為產(chǎn)品的每一個(gè)字段添加一個(gè)綁定列或CheckBoxField。

圖 4: 對(duì)應(yīng)產(chǎn)品的每一個(gè)字段,GridView都包含一個(gè)BoundField或CheckBoxField

  當(dāng)最終用戶編輯一個(gè)產(chǎn)品并點(diǎn)擊它的保存按鈕(Update),該GridView遍歷那些可編輯的字段,然后把用戶輸入的值賦值到ObjectDataSource的UpdateParameters集合里對(duì)應(yīng)的參數(shù)。如果沒(méi)有對(duì)應(yīng)的參數(shù),GridView則添加一個(gè)到參數(shù)集合里。因此,如果我們的GridView包含對(duì)應(yīng)產(chǎn)品的所有字段的綁定列或CheckBox列,那么ObjectDataSource則會(huì)調(diào)用能接受這些參數(shù)的方法重載,而不顧ObjectDataSource的聲明標(biāo)記指定只接受3個(gè)輸入?yún)?shù)的事實(shí)(見(jiàn)圖5)。類似地,如果存在某些由GridView非只讀列構(gòu)成的組合,而沒(méi)有一個(gè)UpdateProduct重載能接受相應(yīng)的參數(shù),則會(huì)在試圖保存時(shí)引發(fā)一個(gè)異常。

圖 5: GridView將添加參數(shù)到ObjectDataSource的UpdateParameters集合

  為了確保ObjectDataSource調(diào)用僅接受productName、unitPrice和productID參數(shù)的UpdateProduct重載,我們需要限定GridView僅包含ProductName和UnitPrice這兩個(gè)可編輯的列。這可以通過(guò)刪除其他綁定列和CheckBox列,或者把這些列的ReadOnly屬性設(shè)置為true實(shí)現(xiàn),又或者上述兩種方法結(jié)合使用。在本節(jié)里讓我們簡(jiǎn)單地刪除除了ProductName和UnitPrice綁定列以外的GridView的所有列,然后,GridView的聲明標(biāo)記將如下所示:

asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
  DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
  Columns>
    asp:CommandField ShowEditButton="True" />
    asp:BoundField DataField="ProductName"
     HeaderText="ProductName" SortExpression="ProductName" />
    asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
     SortExpression="UnitPrice" />
  /Columns>
/asp:GridView>

  即使重載預(yù)期3個(gè)輸入?yún)?shù),在我們的GridView里僅包含兩個(gè)綁定列。這是因?yàn)閜roductID輸入?yún)?shù)是一個(gè)主鍵(primary key)的值,它通過(guò)當(dāng)前編輯行的DataKeyNames屬性傳入值。

  我們的GridView控件,連同這個(gè)UpdateProduct重載,允許一個(gè)用戶僅僅編輯產(chǎn)品的名稱和單價(jià)而不會(huì)丟失產(chǎn)品的其他字段。

圖 6: 僅允許編輯 ProductName和UnitPrice的界面

完善UnitPrice格式化

  雖然圖6所示的GridView實(shí)例能夠正常工作,UnitPrice字段還完全未被格式化,導(dǎo)致顯示價(jià)格時(shí)缺少貨幣符號(hào),還有4個(gè)小數(shù)位。為了在非編輯狀態(tài)的行應(yīng)用貨幣格式,只需要簡(jiǎn)單地設(shè)置UnitPrice綁定列的DataFormatString屬性為{0:c},還有它的HtmlEncode屬性為false 。

圖 7: 設(shè)置UnitPrice綁定列的DataFormatString和HtmlEncode屬性

通過(guò)此項(xiàng)更改,處于非編輯狀態(tài)的行將價(jià)格格式化為貨幣;然而,當(dāng)前編輯的行,仍然顯示為沒(méi)有貨幣符號(hào)并保留四位小數(shù)。

圖 8: 現(xiàn)在,非編輯狀態(tài)的行格式化為貨幣值

通過(guò)設(shè)置此綁定列的ApplyFormatInEditMode屬性為true(默認(rèn)為false),可以把DataFormatString屬性里指定的格式化指令應(yīng)用到編輯界面。

圖 9: 設(shè)置此綁定列的ApplyFormatInEditMode屬性為true

通過(guò)這個(gè)更改,當(dāng)前編輯行里顯示的UnitPrice值也被格式化為貨幣。

圖 10: 現(xiàn)在,當(dāng)前編輯行的值也被格式化為貨幣

  然而,如果把產(chǎn)品價(jià)格更新為文本框里帶貨幣符號(hào)的值– 例如$19.00 – 則會(huì)拋出一個(gè)FormatException異常。當(dāng)GridView嘗試把用戶提供的值賦值到ObjectDataSource的UpdateParameters集合,它無(wú)法把UnitPrice字符串“$19.00”轉(zhuǎn)換成參數(shù)要求的decimal類型(見(jiàn)圖11)。為了補(bǔ)救這個(gè)問(wèn)題我們可以為GridView的RowUpdating事件添加一個(gè)事件處理程序并讓它把用戶輸入的UnitPrice格式化為貨幣格式的decimal 。

  這個(gè)GridView的RowUpdating事件接受的第二個(gè)參數(shù)是一個(gè)GridViewUpdateEventArgs類型的對(duì)象,它包含一個(gè)NewValues字典,當(dāng)中的每一個(gè)屬性保存著用戶輸入的值,準(zhǔn)備賦值到ObjectDataSource的UpdateParameters集合。我們可以重寫(xiě)現(xiàn)有的NewValues集合中的UnitPrice值為一個(gè)貨幣金額,通過(guò)下面的事件處理程序中的代碼進(jìn)行解析:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
 if (e.NewValues["UnitPrice"] != null)
  e.NewValues["UnitPrice"] =
    decimal.Parse(e.NewValues["UnitPrice"].ToString(),
      System.Globalization.NumberStyles.Currency);
}

  如果用戶提供了一個(gè)諸如“$19.00”的UnitPrice值,這個(gè)值會(huì)被通過(guò)Decimal.Parse計(jì)算并解析為貨幣金額的值重寫(xiě)。這將正確的解析貨幣值,無(wú)論是貨幣符號(hào)、逗號(hào)、小數(shù)點(diǎn)、等等,并使用System.Globalization命名空間的NumberStyles枚舉。

  圖11展示因用戶輸入的UnitPrice值帶有貨幣符號(hào)引起的問(wèn)題,還展示了如果利用GridView的RowUpdating事件處理程序從而正確地解析這樣的輸入。

圖 11: 現(xiàn)在,當(dāng)前編輯行的UnitPrice值被格式化為貨幣金額

第二步: 阻止NULL UnitPrices

  雖然數(shù)據(jù)庫(kù)被配置為允許Products表里的UnitPrice字段為NULL值,但我們可能希望防止用戶訪問(wèn)這個(gè)特別的頁(yè)面并指定一個(gè)空的UnitPrice值。更確切地說(shuō),如果用戶在編輯一個(gè)產(chǎn)品行記錄時(shí)忘記輸入一個(gè)UnitPrice值, 與其保存這個(gè)結(jié)果到數(shù)據(jù)庫(kù),我們還不如給用戶顯示一個(gè)提示信息,自始至終這個(gè)頁(yè)面,任何的對(duì)產(chǎn)品的編輯必須指定一個(gè)價(jià)格。

  傳入到GridView的事件處理程序的GridViewUpdateEventArgs對(duì)象包含一個(gè)Cancel屬性,如果把它設(shè)置為true,則中止這個(gè)更新過(guò)程。讓我們擴(kuò)展RowUpdating事件處理程序,設(shè)置e.Cancel為true并顯示一個(gè)信息說(shuō)明為什么在NewValues集合里的UnitPrice值為null 。

  首先,添加一個(gè)Label服務(wù)器控件到頁(yè)面并命名為MustProvideUnitPriceMessage 。這個(gè)Label控件將顯示用戶是否在更新一個(gè)產(chǎn)品時(shí)忘記指定一個(gè)UnitPrice值。設(shè)置這個(gè)Label的Text屬性為“您必須為產(chǎn)品提供一個(gè)價(jià)格?!薄N乙惨呀?jīng)在Styles.css文件中添加了一個(gè)名為Warning的新CSS類別,定義如下:

.Warning
{
  color: Red;
  font-style: italic;
  font-weight: bold;
  font-size: x-large;
}

最后,設(shè)置Label的CssClass屬性為Warning 。這樣設(shè)計(jì)器中將在GridView上方顯示這個(gè)紅色、斜體、加粗、并且較大字體的警告信息。

圖 12: 一個(gè)Label控件已被添加到GridView上方

默認(rèn)地,這個(gè)Label控件隱藏,那么在Page_Load事件處理程序中設(shè)置它的Visible屬性為false 。

protected void Page_Load(object sender, EventArgs e)
{
  MustProvideUnitPriceMessage.Visible = false;
}

如果用戶嘗試更新一個(gè)產(chǎn)品并不指定UnitPrice值,我們希望取消這個(gè)更新并顯示警告標(biāo)簽。在GridView的RowUpdating事件處理程序中增加如下的代碼:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
  if (e.NewValues["UnitPrice"] != null)
  {
    e.NewValues["UnitPrice"] =
      decimal.Parse(e.NewValues["UnitPrice"].ToString(),
        System.Globalization.NumberStyles.Currency);
  }
  else
  {
    // Show the Label
    MustProvideUnitPriceMessage.Visible = true;

    // Cancel the update
    e.Cancel = true;
  }
}

如果一個(gè)用戶試圖保存一個(gè)產(chǎn)品并不指定價(jià)格,這個(gè)更新操作就被取消并顯示一個(gè)有用的提示信息。雖然數(shù)據(jù)庫(kù)(和業(yè)務(wù)邏輯)允許NULL值的UnitPrice,但這個(gè)特定的ASP.NET頁(yè)面不允許。

圖 13: 用戶不能讓UnitPrice為空

  到目前為止我們看過(guò)了如何使用GridView的RowUpdating事件來(lái)編程改變賦值到ObjectDataSource的UpdateParameters集合的參數(shù)值,還有如何完全地取消這個(gè)更新過(guò)程。這些思想也可以延展至DetailsView和FormView控件并且應(yīng)用到插入或刪除。

  這些任務(wù)也可以在ObjectDataSource這一層通過(guò)的Inserting、Updating和Deleting事件處理程序完成。這些事件在隱含對(duì)象的關(guān)聯(lián)方法被調(diào)用前觸發(fā),并且提供一個(gè)更改輸入?yún)?shù)集合或者完全取消此操作的最后機(jī)會(huì)。對(duì)應(yīng)這3個(gè)事件的事件處理程序傳入一個(gè)ObjectDataSourceMethodEventArgs 類型的對(duì)象,我們對(duì)它的這兩個(gè)屬性感興趣:

·Cancel,它如果被設(shè)置為true,取消執(zhí)行中的操作

·InputParameters,它是InsertParameters、UpdateParameters或DeleteParameters的集合,這取決于這是Inserting、Updating、還是Deleting事件的事件處理程序

  為了舉例說(shuō)明在ObjectDataSource這一層如何處理參數(shù)的值,讓我們?cè)陧?yè)面里包含一個(gè)DeailsView,它允許用戶新增一個(gè)新的產(chǎn)品記錄。這個(gè)DetailsView將用作提供一個(gè)快捷的方式添加一個(gè)新的產(chǎn)品記錄到數(shù)據(jù)庫(kù)。為了在新增產(chǎn)品時(shí)保持界面一致,我們僅允許用戶輸入ProductName和UnitPrice字段。作為默認(rèn)值,這些在DetailsView的插入界面提供的值將被設(shè)置為一個(gè)數(shù)據(jù)庫(kù)的NULL值。不過(guò),我們可以使用ObjectDataSource的Inserting事件注入不同的默認(rèn)值,正如我們馬上要看的。

第三步: 提供一個(gè)添加新產(chǎn)品的界面

  在GridView的上方,從工具箱里拖放一個(gè)DetailsView控件到設(shè)計(jì)器,清空它的Height和Width屬性,并將它綁定到頁(yè)面中已經(jīng)存在的ObjectDataSource 。這將為產(chǎn)品的每一個(gè)字段添加一個(gè)綁定列或CheckBox列。因?yàn)槲覀兿M眠@個(gè)DetailsView控件來(lái)添加新產(chǎn)品,我們需要從它的職能標(biāo)記里勾選啟用插入這一項(xiàng);然而并沒(méi)有這一項(xiàng),這是因?yàn)榇薕bjectDataSource的Insert()方法還沒(méi)有映射到ProductsBLL類的方法(回想起我們?cè)谂渲脭?shù)據(jù)源時(shí)設(shè)置了這個(gè)映射為(無(wú)) – 見(jiàn)圖3)。

  為了再次配置這個(gè)ObjectDataSource,從它的職能標(biāo)記中選擇“配置數(shù)據(jù)源”的鏈接,載入向?qū)?。第一屏允許你更改ObjectDataSource綁定到的隱含對(duì)象;讓它依舊是ProductsBLL 。下一屏列出從ObjectDataSource到隱含對(duì)象的方法的映射。盡管我們已經(jīng)明確地指定Insert()和Delete()不映射到任何方法,然而如果你到INSERT和DELETE的tab頁(yè)你還是會(huì)看到那里有一個(gè)映射。這是因?yàn)镻roductsBLL的AddProduct和DeleteProduct方法使用了DataObjectMethodAttribute指出它們分別是為Insert()和Delete()服務(wù)的默認(rèn)的方法。因此,ObjectDataSource向?qū)г诿看芜\(yùn)行時(shí)都會(huì)自動(dòng)地選擇它們,除非那里被明確地指定了一個(gè)別的值。

  讓Insert()方法依舊指向AddProduct方法,不過(guò)再次從DELETE的tab頁(yè)的下拉列表中選擇“(無(wú))”。

圖 14: 從INSERT的Tab頁(yè)的下拉列表中選擇AddProduct方法

圖 15: 從DELETE的Tab頁(yè)的下拉列表中選擇(無(wú))

完成了這些更改后,該ObjectDataSource的聲明語(yǔ)法中將包含一個(gè)InsertParameters集合,如下所示:

asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
  SelectMethod="GetProducts" TypeName="ProductsBLL"
  UpdateMethod="UpdateProduct" OnUpdating="ObjectDataSource1_Updating"
  InsertMethod="AddProduct" OldValuesParameterFormatString="original_{0}">
  UpdateParameters>
    asp:Parameter Name="productName" Type="String" />
    asp:Parameter Name="unitPrice" Type="Decimal" />
    asp:Parameter Name="productID" Type="Int32" />
  /UpdateParameters>
  InsertParameters>
    asp:Parameter Name="productName" Type="String" />
    asp:Parameter Name="supplierID" Type="Int32" />
    asp:Parameter Name="categoryID" Type="Int32" />
    asp:Parameter Name="quantityPerUnit" Type="String" />
    asp:Parameter Name="unitPrice" Type="Decimal" />
    asp:Parameter Name="unitsInStock" Type="Int16" />
    asp:Parameter Name="unitsOnOrder" Type="Int16" />
    asp:Parameter Name="reorderLevel" Type="Int16" />
    asp:Parameter Name="discontinued" Type="Boolean" />
  /InsertParameters>
/asp:ObjectDataSource>

  再次運(yùn)行向?qū)?dǎo)致重新添加OldValuesParameterFormatString屬性。把這個(gè)屬性設(shè)置為默認(rèn)值({0})或者從聲明語(yǔ)法中把它們完全刪除。

  隨著ObjectDataSource提供插入數(shù)據(jù)的能力,現(xiàn)在DetailsView的職能標(biāo)記里包含“啟用插入”的checkbox;回到設(shè)計(jì)器并勾選這一項(xiàng)。然后,減少DetailsView的列直道它只包含兩個(gè)綁定列- ProductName和UnitPrice ,還有一個(gè)CommandField。此時(shí)DetailsView的聲明語(yǔ)法將如下所示:

asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
  DataKeyNames="ProductID" DataSourceID="ObjectDataSource1">
  Fields>
    asp:BoundField DataField="ProductName"
     HeaderText="ProductName" SortExpression="ProductName" />
    asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
     SortExpression="UnitPrice" />
    asp:CommandField ShowInsertButton="True" />
  /Fields>
/asp:DetailsView>

  圖16展現(xiàn)的是在此時(shí)通過(guò)瀏覽器查看的頁(yè)面。正如你所看到的,DetailsView列出第一個(gè)產(chǎn)品(Chai)的名稱和價(jià)格。不過(guò),我們需要的是一個(gè)插入界面來(lái)提供一個(gè)用戶快速增加一個(gè)新產(chǎn)品到數(shù)據(jù)庫(kù)的手段。

圖16: 該DetailsView當(dāng)前呈現(xiàn)在只讀模式

  為了展示插入模式的DetailsView我們需要設(shè)置DefaultMode屬性為Inserting。這讓DetailsView在第一次訪問(wèn)和插入一條新紀(jì)錄之后,它都呈現(xiàn)在插入模式。如圖17所示,這樣的一個(gè)DetailsView提供了一個(gè)快捷的界面用以添加新記錄。

圖 17: 這個(gè)DetailsView提供了一個(gè)快速添加新產(chǎn)品的界面

  當(dāng)用戶輸入一個(gè)產(chǎn)品名稱和價(jià)格(例如“Acme Wate”和1.99,如圖17)并點(diǎn)擊插入按鈕,發(fā)生回傳并且開(kāi)始插入的工作流程,直到最后添加一個(gè)新產(chǎn)品記錄到數(shù)據(jù)庫(kù)。DetailsView維持在它的插入界面,并且GridView自動(dòng)地重現(xiàn)綁定到它的數(shù)據(jù)源,目的是為了包含新增加的產(chǎn)品,如圖18所示。

圖 18: 產(chǎn)品“Acme Water”已經(jīng)被添加到數(shù)據(jù)庫(kù)

  雖然圖18的GridView中沒(méi)有顯示出來(lái),DetailsView界面里缺少的產(chǎn)品字段 – CategoryID、SupplierID、QuantityPerUnit、等等 – 被賦上一個(gè)數(shù)據(jù)庫(kù)NULL值。你可以通過(guò)履行下面一個(gè)步驟來(lái)看到這一點(diǎn):

1.到Visual Studio的服務(wù)器資源管理器

2.展開(kāi)NORTHWND.MDF數(shù)據(jù)庫(kù)節(jié)點(diǎn)

3.在Products數(shù)據(jù)表節(jié)電上右鍵點(diǎn)擊

4.選擇“顯示表數(shù)據(jù)”

  這將列出Products表中的所有記錄。如圖19所示,除了ProductID、ProductName和UnitPrice字段,我們的新產(chǎn)品的其它字段都為NULL值。

圖 19: 未在DetailsView中提供的產(chǎn)品的其它字段被賦予NULL值

  我們可能希望給予一個(gè)或幾個(gè)這些字段的值一個(gè)默認(rèn)值,而不是NULL,要么是因?yàn)镹ULL并非最佳的默認(rèn)項(xiàng),要么是因?yàn)閿?shù)據(jù)庫(kù)字段本身不允許NULL值。為了實(shí)現(xiàn)這一點(diǎn),我們可以編程設(shè)置這些DetailsView的InputParameters集合里的參數(shù)值。這項(xiàng)工作可以在DetailsView的ItemInserting事件處理程序中完成,或者在ObjectDataSource的Inserting事件處理程序。因?yàn)槲覀円呀?jīng)看過(guò)了如何在數(shù)據(jù)Web服務(wù)器控件中如何使用pre-和post-level的事件,這次讓我們探究一下ObjectDataSource的事件。

 第四步: 給CategoryID和SupplierID參數(shù)賦值

  在這里我們假設(shè)當(dāng)我們的應(yīng)用程序通過(guò)這個(gè)界面添加一個(gè)新產(chǎn)品時(shí)應(yīng)該給CategoryID和SupplierID字段賦值為1。如之前提及的,ObjectDataSource控件有一對(duì)pre-和post-level的事件發(fā)生在數(shù)據(jù)更改過(guò)程中。當(dāng)它的Insert()方法被調(diào)用時(shí),ObjectDataSource首先觸發(fā)它的Inserting事件,然后調(diào)用它的Insert()方法所映射到的業(yè)務(wù)方法,最后觸發(fā)Inserted事件。這個(gè)Inserting事件處理程序提供給我們一個(gè)處理輸入?yún)?shù)或者徹底取消此操作的最后機(jī)會(huì)。

  注意: 在一個(gè)真實(shí)的應(yīng)用程序中你很可能希望既讓用戶指定category和supplier的值,又希望基于一定的標(biāo)準(zhǔn)和業(yè)務(wù)邏輯的基礎(chǔ)上選擇這個(gè)值(而不是盲目地選擇ID為1)。不管如何,這個(gè)例子闡明了如何在ObjectDataSource的pre-level的事件中編程設(shè)置一個(gè)輸入?yún)?shù)的值。

  花些時(shí)間為ObjectDataSource的Inserting事件創(chuàng)建一個(gè)事件處理程序。注意到該事件處理程序的第二個(gè)輸入?yún)?shù)是一個(gè)ObjectDataSourceMethodEventArgs類型的對(duì)象,它有一個(gè)屬性來(lái)存取參數(shù)集合(InputParameters),還有一個(gè)屬性用來(lái)取消此操作(Cancel)。

protected void ObjectDataSource1_Inserting
  (object sender, ObjectDataSourceMethodEventArgs e)
{

}

  此時(shí),InputParameters屬性包含了通過(guò)DetailsView賦值到ObjectDataSource的InsertParameters集合。為了修改這些參數(shù)里的一個(gè)值,簡(jiǎn)單地使用:e.InputParameters["paramName"] = value 。所以,為了設(shè)置CategoryID和SupplierID為1,把Inserting事件處理程序調(diào)整為如下:

protected void ObjectDataSource1_Inserting
  (object sender, ObjectDataSourceMethodEventArgs e)
{
  e.InputParameters["CategoryID"] = 1;
  e.InputParameters["SupplierID"] = 1;
}

這次當(dāng)我們添加一個(gè)新產(chǎn)品(例如Acme Soda),這個(gè)新產(chǎn)品的CategoryID和SupplierID字段被賦值為1(見(jiàn)圖20)。

圖 20: 現(xiàn)在,新產(chǎn)品的CategoryID和SupplierID字段被設(shè)置為1

總結(jié)

  在編輯、插入和刪除的過(guò)程中,無(wú)論數(shù)據(jù)Web服務(wù)器控件還是ObjectDataSource都會(huì)發(fā)生許多pre-和post-level的事件。在這一節(jié)里,我們研究了pre-level的事件,并看到了如何在數(shù)據(jù)Web服務(wù)器控件和ObjectDataSource的事件里使用它們來(lái)自定義輸入?yún)?shù)或取消當(dāng)前的數(shù)據(jù)更改操作。下一節(jié),我們將看看創(chuàng)建和使用post-level的事件的事件處理程序。

祝編程快樂(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下gridview 批量刪除的實(shí)現(xiàn)方法
  • Asp.Net+XML操作基類(修改,刪除,新增,創(chuàng)建)
  • asp.net GridView 刪除時(shí)彈出確認(rèn)對(duì)話框(包括內(nèi)容提示)
  • asp.net中g(shù)ridview的查詢、分頁(yè)、編輯更新、刪除的實(shí)例代碼
  • asp.net 編輯gridview的小例子
  • Asp.net的GridView控件實(shí)現(xiàn)單元格可編輯方便用戶使用
  • ASP.NET MVC4入門(mén)教程(六):驗(yàn)證編輯方法和編輯視圖
  • 在ASP.NET 2.0中操作數(shù)據(jù)之十六:概述插入、更新和刪除數(shù)據(jù)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之十九:給編輯和新增界面增加驗(yàn)證控件
  • 在ASP.NET 2.0中操作數(shù)據(jù)之二十二:為刪除數(shù)據(jù)添加客戶端確認(rèn)
  • 在ASP.NET 2.0中操作數(shù)據(jù)之三十六:在DataList里編輯和刪除數(shù)據(jù)概述

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在ASP.NET 2.0中操作數(shù)據(jù)之十七:研究插入、更新和刪除的關(guān)聯(lián)事件》,本文關(guān)鍵詞  在,ASP.NET,2.0,中,操作,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《在ASP.NET 2.0中操作數(shù)據(jù)之十七:研究插入、更新和刪除的關(guān)聯(lián)事件》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于在ASP.NET 2.0中操作數(shù)據(jù)之十七:研究插入、更新和刪除的關(guān)聯(lián)事件的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    理论片午午伦夜理片在线播放| 成人综合专区| 成人动漫h在线观看| 欧美精品日韩综合在线| 日本高清不卡免费| 99精品国产一区二区三区2021| 一级做a爰片性色毛片视频| 欧美成人禁片在线观看网址| 日日天天久久| 亚洲电影在线看| 亚洲爆乳无码一区二区三区| 性色av一区二区三区红粉影视| 午夜伦欧美伦电影理论片| 国产一区二区三区四区老人| 国产精品婷婷| 久久久久久黄| 一区二区三区福利| 亚洲午夜精品久久| 青青热久免费精品视频在线18| 色老汉一区二区三区| 欧美久久久精品| 一区二区三区四区在线免费观看| 北岛玲日韩精品一区二区三区| 欧美日韩在线中文字幕| 成年人性生活视频| 免费看黄色片的网站| 欧美日韩中文字幕在线视频| 中文字幕在线观看日韩| 亚洲欧洲偷拍精品| 免费不卡亚洲欧美| 亚洲天堂网一区二区| 中文字幕不卡在线观看| 六月丁香在线视频| 精品视频免费看| 中文字幕成人一区| 97精品国产99久久久久久免费| 国产精品久久久久av| 亚洲欧洲综合另类| 中文天堂在线资源| 成人a级免费视频| 成人精品三级| 色偷偷偷亚洲综合网另类| 久久6精品影院| 免费电影网站在线视频观看福利| 成人亚洲一区二区| 欧美韩日一区二区三区四区| 国产毛片视频网站| 美女视频黄 久久| 97国产精品videossex| 日韩av影视| 日韩在线视频免费观看| 11024精品一区二区三区日韩| 国产一区二区视频免费观看| 久久久久成人精品免费播放动漫| 免费网站在线观看黄| 欧美日韩国产中文字幕在线| 欧美二区三区91| 亚洲精品成人区在线观看| 国产亚洲欧洲高清一区| 蜜桃传媒在线| 国产精品视频在| 亚洲sss视频在线视频| 美女视频一区二区三区在线| 久久99国产精品久久99小说| 福利视频网站一区二区三区| 欧美高清成人| а√天堂官网中文在线| 在线一区二区日韩| 白天操夜夜操| 久久人人97超碰人人澡爱香蕉| 中文字幕亚洲视频| 成年免费插网| 视频直播国产精品| 亚洲小说图片区| 青青草久久网络| 岛国在线免费| 99riav国产精品| 色婷婷综合久色| 中日韩黄色大片| ㊣最新国产の精品bt伙计久久| 91精品韩国| 国产一级在线播放| 视频二区欧美| 在线中文资源天堂| 三级精品视频久久久久| 国内精品视频在线| 91麻豆精品国产91久久久久推荐资源| 欧美日韩**字幕一区| 91精品国产91综合久久蜜臀| 国产午夜久久av| av色综合网| 国产精品综合在线| 欧美精品一区免费| 成人黄色国产精品网站大全在线免费观看| 精品无码人妻一区二区三区| 影院在线观看全集免费观看| 国产人成网在线播放va免费| 欧美性色黄大片| 亚洲黄色www| 嫩草影院2018| 精品美女在线观看视频在线观看| 国产精品视频免费一区二区三区| 捆绑裸体绳奴bdsm亚洲| 91精品国自产在线偷拍蜜桃| 午夜少妇久久久久久久久| 久久99国产精品自在自在app| 国产成人在线观看| 久久精品嫩草影院| 999视频在线观看| 欧美日韩国产一区二区在线观看| 久久在线免费观看视频| 欧美激情综合色综合啪啪五月| 男女无套免费视频网站动漫| 久久婷婷影院| 中文字幕av手机在线| 免费av福利在线观看| 国产一级精品毛片| 欧美亚洲愉拍一区二区| 2019天天操夜夜操| 欧美天堂在线视频| 国产在线拍揄自揄拍无码视频| 亚洲精品99999| 亚洲人成电影| 久久综合久久99| 国产无遮挡又黄又爽免费软件| 天天综合网天天做天天受| 亚洲精品少妇久久久久久| 国产一区二区三区四区福利| av成人观看| 午夜激情视频在线播放| 欧美一二三视频| 色综合久久精品| 97视频在线观看成人| 色综合久久五月| 91视频免费看| 日本久久电影网| 麻豆电影在线播放| www.久久91| 欧美成人有码| 日本10禁啪啪无遮挡免费一区二区| 欧美乱偷一区二区三区在线| 美女黄视频在线播放| 国产高清亚洲| 亚洲黄色免费av| 婷婷综合在线视频| 亚洲国产精品热久久| 国产精品一区一区三区| 国产精品无码一区二区在线| 国产精品伊人日日| 日韩av黄色网址| 欧美日韩国产另类不卡| 久草在线在线精品观看| 日韩欧美精品一区| 欧美国产精品人人做人人爱| 国产精品 欧美精品| 欧美日韩精品一区二区三区四区| 久久97久久97精品免视看| 精品国产99久久久久久宅男i| 日韩一区二区三区精品| 欧美一区二区三区少妇| 亚洲欧洲国产综合| 亚洲中文字幕在线一区| 国产第一页第二页| 九九精品在线观看| 精品999在线| 动漫美女被爆操久久久| 自拍视频第一页| 黄色一级视频免费观看| 91麻豆精品国产91久久久使用方法| 亚洲av无码乱码国产精品fc2| 天天操天天干天天| 日韩av中字| 午夜精品福利视频网站| 国产精品一区二区免费在线观看| 中日韩一级黄色片| 国产永久免费高清在线观看| 国产精品一区视频网站| 国产成人精品a视频一区www| 欧美猛交ⅹxxx乱大交视频| 天堂中文8资源在线8| 91桃色在线观看| 亚洲国产中文在线二区三区免| 丁香激情五月少妇| 日本夜爽爽一二区| youjizzxxxx18| 情侣偷拍对白清晰饥渴难耐| 亚洲小说春色综合另类网蜜桃| 57pao国产成人免费| 欧美疯狂xxxx大交乱88av| 在线亚洲男人天堂| 日日碰狠狠丁香久燥| 免费看污视频的网站| 精品捆绑调教一区二区三区| 国产视频一区二区在线| 欧美一区二区三区视频在线| 喷白浆一区二区| 精品中文字幕乱| 国产视频精品免费| 在线观看网站黄| 天使と恶魔の榨精在线播放| 国产综合视频一区二区三区免费| 污网站在线观看视频| 视频一区二区三区在线观看| 欧美在线一级va免费观看| 乱子伦在线视频| 久久夜色撩人精品| 欧美先锋资源| 久草亚洲一区| 在线观看欧美日韩电影| 亚洲最大的黄色网| 国产在线视频不卡二| 亚洲资源在线网| www五月天com| 污污视频在线看| 国产成人av福利| 色综合天天在线| 中文字幕欧美在线| 91亚洲自偷观看高清| 在线看女人毛片| 7777精品伊人久久久大香线蕉经典版下载| 亚洲韩国日本中文字幕| 2014亚洲天堂| 亚洲片在线观看| av资源在线免费观看| 中文字幕精品视频| 久久久久久久影院| 亚洲国产婷婷香蕉久久久久久99| 欧美蜜桃一区二区三区| 中文字幕av高清| 粉嫩欧美一区二区三区高清影视| 成人动漫视频在线观看免费| 日韩一区二区三| 亚洲丝袜在线观看| 国产一区二区黄| 白白色视频在线| 日韩在线视屏| 欧美午夜激情小视频| 中文字幕2022永久在线| 中文字幕在线视频一区二区三区| 日韩欧美亚洲国产另类| 久久久久久久久影院| 97caopor国产在线视频| 天堂www中文在线资源| 久久久久久久久久久福利| 麻豆国产欧美一区二区三区| 国产精品-色哟哟| 香港三级经典全部种子下载| 日韩一级免费观看| 日本女人性生活视频| 欧美韩日一区| 国产成人精品一区二区三区四区| 成人午夜在线观看视频| 97久久精品国产| 97欧美精品一区二区三区| 韩国美女主播一区| 国产乱码午夜在线视频| 欧区一欧区二欧区三| 中文字幕亚洲一区二区三区| 免费在线高清av| 好吊色视频在线观看| 7777精品久久久久久| www.99re7.com| 久久久久久久久久久综合| 一级欧美视频| 亚洲视频在线一区观看| 日韩欧美国产不卡| 亚洲日韩第一页| 免费a级毛片在线观看| 天堂中文最新版在线中文| 亚洲高清免费在线观看| 欧美乱妇18p| 欧美电影免费看| 欧美精品羞羞答答| freehdxxxx护士| 亚洲综合成人网| 国产精品一区二区三区不卡| 你懂的国产视频| 99久re热视频这里只有精品6| 精品熟女一区二区三区| 秋霞在线观看一区二区三区| 日批视频在线看| lutube成人福利在线观看| 国产亚洲亚洲国产一二区| 快播亚洲色图| 青青草原在线免费观看视频| chinesegaysextube| 午夜视频在线瓜伦| hs视频在线观看| 国产精品爽爽爽爽爽爽在线观看| 国产成年人在线观看| 日韩中文字幕国产精品| 99国产一区二区三精品乱码| 波多野洁衣一区| 毛片一区二区| 7777精品视频| 亚洲一区二区三区精品动漫| 影音先锋中文字幕在线| 老司机精品免费视频| 在线观看中文字幕视频| 久久久九九九九| 国产成人亚洲一区二区三区| 久久久不卡网国产精品一区| 午夜精品区一区二区三| 加勒比在线日本| 亚洲中字黄色| 欧美日韩中文一区二区| 国产无套内射又大又猛又粗又爽| 国产在线精品视频| 国产精品久久久久91| 毛片在线免费视频| 国内高清免费在线视频| 草莓视频成人appios| 久久国产综合精品| 中文字幕免费在线看线人动作大片| 国产成人av免费看| 97电影在线观看| 99re66热这里只有精品3直播| 国产成人在线电影| 国产中文字幕二区| www免费视频| 97精品久久久中文字幕免费| 粉嫩虎白女毛片人体| 日韩av片永久免费网站| 成人亚洲精品久久久久软件| 精品国产一区二区三区四区阿崩| 四虎永久在线观看免费网站网址| 真人bbbbbbbbb毛片| 久本草在线中文字幕亚洲欧美|