熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET控件開發基礎之復合控件事件處理淺析

2013-11-13 10:24:07  來源: .NET編程 

  上一篇寫了ASPNET控件開發基礎之復合控件基本的概念這次就繼續上次的話題來學習ASPNET復合控件如何觸發事件

  對於ASPNET控件開發基礎的學習首先我們先明白些內容

  有一些ASPNET復合控件直接把按鈕觸發事件所需的事情封裝好另外一種則是自定義事件更具靈活性當然這是根據需要設計的以下會以例子來說明的下面我們假設我們控件中有兩個按鈕以下不列出所有代碼具體可在文章最後下載代碼

  () 直接實現按鈕事件

  在控件中(以下代碼並非實現復合控件)直接實現事件則無需自定義事件如下代碼(如果對數據回傳有些不熟悉的話可先看第三篇希望對你有幫助)

  ASPNET控件開發基礎示例一(只列出局部代碼具體可在文章最後下載代碼)

  void IPostBackEventHandlerRaisePostBackEvent(string eventArgument)

  {

  if (eventArgument == Previous)

  PreviousText = 你點擊了PreviousText按鈕;

  else if (eventArgument == Next)  NextText = 你點擊了NextText按鈕;

  }

  protected override void RenderContents(HtmlTextWriter writer)

  {

  writerAddAttribute(HtmlTextWriterAttributeOnclick

  PageGetPostBackEventReference(this Previous));

  writerRenderBeginTag(HtmlTextWriterTagButton);

  writerWrite(thisPreviousText);

  writerRenderEndTag();

  writerAddAttribute(HtmlTextWriterAttributeOnclick

  PageGetPostBackEventReference(this Next));

  writerRenderBeginTag(HtmlTextWriterTagButton);

  writerWrite(thisNextText);

  writerRenderEndTag();

  }

  還記得第三篇時示例一中下面的代碼嗎?此控件中只觸發了一個事件所以無需根據服務器傳遞的參數來判斷出發哪個事件

  //實現RaisePostBackEvent方法處理回發事件  public void RaisePostBackEvent(string eventArgument)

  {

  OnClick(EventArgsEmpty);

  }

  RaisePostBackEvent方法有一個eventArgument參數用來傳遞事件數據代碼實現了一個空參數傳遞(eventArgument參數為空)的事件OnClick(EventArgsEmpty)

  再比較一下示例一的代碼因為其用到了兩個按鈕

  PageGetPostBackEventReference方法用來傳遞參數

  RaisePostBackEvent方法則以傳遞參數來判斷觸發哪個按鈕

  小結:

  在控件中直接實現按鈕事件則無需定義自定義事件但別忘了在RaisePostBackEvent方法中根據傳遞過來的不同參數來加以判斷

  ()以自定義事件實現

  根據示例一上面的代碼加上自定義委托和事件如下代碼(只列出局部代碼具體可在文章最後下載代碼)

  ASPNET控件開發基礎示例二

  void IPostBackEventHandlerRaisePostBackEvent(string eventArgument)

  {

  if (eventArgument == Previous)  OnClickPrevious(EventArgsEmpty);

  else if

  (eventArgument == Next)

  OnClickNext(EventArgsEmpty);

  }

  調用代碼如下

  protected void NavButtons__ClickPrevious(object sender EventArgs e)

  {

  LabelText = 你點擊了PreviousText按鈕;

  }

  protected void NavButtons__ClickNext(object sender EventArgs e)

  {

  LabelText = 你點擊了NextText按鈕;

  }

  小結:在示例一的基礎上去除直接實現好的按鈕事件然後自定義事件

  再次提醒如果大家對回發事件還請再參考一些文章先弄清楚或者也可以看看我寫的第三篇文章

  好了上面講的都非復合控件但復合控件實現起來卻很相似或者可以說更加簡單

  下面先來看個簡單的示例(大家知道button按鈕有CommandName屬性和CommandArgument屬性)

  ASPNET控件開發基礎示例三

  ﹤%@ Page Language=C# %﹥ ﹤!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN  transitionaldtd

  ﹤script runat=server

  protected void Button_Click(object sender EventArgs e)

  {

  LabelText = 你點擊了左按鈕;

  }

  protected void Button_Click(object sender EventArgs e)

  {

  LabelText = 你點擊了右按鈕;

  }

  protected void btn_command(object sender CommandEventArgs e)

  {

  switch (eCommandName)

  {

  case left:  LabelText = 你點擊了左按鈕;

  break;  case right:  LabelText = 你點擊了右按鈕;  break;

  }

  }

  protected void btn_command(object sender CommandEventArgs e)

  {

  switch (eCommandName)

  {

  case left:  Button_Click(this e);

  break;

  case right:  Button_Click(this e);

  break;

  }

  }

  ﹤/script﹥

  ﹤html xmlns=

  ﹤head runat=server

  ﹤title﹥無標題頁﹤/title﹥

  ﹤/head﹥

  ﹤body﹥

  ﹤form id=form runat=server

  ﹤div﹥

  ﹤asp:Button ID=Button runat=server   OnClick=Button_Click Text=左按鈕 /﹥

  ﹤asp:Button ID=Button runat=server Text=右按鈕  OnClick=Button_Click /﹥

  ﹤br /﹥

  ﹤br /﹥

  ﹤asp:Label ID=Label runat=server

  ﹤/asp:Label﹥

  ﹤br /﹥

  ﹤br /﹥

  ﹤asp:Button ID=Button runat=server Text=左按鈕  CommandName=left OnCommand=btn_command /﹥

  ﹤asp:Button ID=Button runat=server Text=右按鈕 OnCommand=btn_command CommandName=right /﹥

  ﹤br /﹥

  ﹤br /﹥

  ﹤asp:Label ID=Label runat=server

  ﹤/asp:Label﹥

  ﹤br /﹥

  ﹤br /﹥

  ﹤asp:Button ID=Button runat=server Text=左按鈕   CommandName=left OnCommand=btn_command /﹥

  ﹤asp:Button ID=Button runat=server Text=右按鈕 OnCommand=btn_command CommandName=right /﹥

  ﹤/div﹥

  ﹤/form﹥

  ﹤/body﹥

  ﹤/html﹥

  以上代碼以三種方式來實現按鈕的觸發事件這裡本應該再舉一個數據綁定控件如(DataList控件的使用)的一個例子的一個例子的這裡目的只為了說明冒泡法的使用冒泡法在DataList等數據綁定控定控件中最能體現出來

  那我們先來看下在ASPNET復合控件中怎麼做?

  直接實現按鈕事件

  以自定義事件實現

  ()以下為微軟網站的示例代碼如下代碼

  ASPNET控件開發基礎示例四

  namespace CompositionSampleControls

  {

  public class Composition : Control INamingContainer

  {

  public int Value

  {

  get {

  thisEnsureChildControls();

  return IntParse(((TextBox)Controls[])Text);

  }

  set

  {

  thisEnsureChildControls();

  ((TextBox)Controls[])Text = valueToString();

  }

  }

  protected override void CreateChildControls()

  {

  // Add Literal Control

  thisControlsAdd(new LiteralControl(﹤h + Value: ));

  // Add Textbox   TextBox box = new TextBox();

  boxText = ;  thisControlsAdd(box);

  // Add Literal Control   thisControlsAdd(new LiteralControl(﹤/h));

  // Add Add Button   Button addButton = new Button();

  addButtonText = Add;

  addButtonClick += new EventHandler(thisAddBtn_Click);

  thisControlsAdd(addButton);

  // Add Literal Control   thisControlsAdd(new LiteralControl( | ));

  // Add Subtract Button   Button subtractButton = new Button();

  subtractButtonText = Subtract;  subtractButtonClick += new EventHandler(thisSubtractBtn_Click);

  thisControlsAdd(subtractButton);

  }

  private void AddBtn_Click(Object sender EventArgs e)

  {

  thisValue++;

  }

  private void SubtractBtn_Click(Object sender EventArgs e)

  {

  thisValue;

  }

  }

  }

  因為內部事件已經實現好了所以比較簡單相信大家都看的懂

  再看復合控件的自定義事件這裡才是我們所要講的重點通常我們提倡在復合控件中采用冒泡法實現事件的上傳上一篇已經說過了復合控件是一個樹結構的控件最典型的就是的數據邦定控件(特殊的復合控件)了如DataList此控件有很多以Command結尾的事件我們剛開始學這個控件的時候總要考慮如何在此控件中實現按鈕事件所采用的就是我們常說的事件冒泡當然還有另一種方法應該說是普通的實現方法服務器控件開發技術與示例稱之為包含法下面我們以例子來說明上面兩種方法

  包含法

  還是以微軟的快速入門教程的代碼為例與上面的代碼對比有幾處變動如下

  注意粗體字自定義事件為復合控件頂層的事件而非其子控件button按鈕的事件button按鈕的事件需調用頂層事件處理程序即實現子控件事件上傳的過程

  ASPNET控件開發基礎示例五

  //自定義事件  public event EventHandler Change;

  //自定義事件處理程序  protected void OnChange(EventArgs e)

  {

  Change(this e);

  }

  //子控件事件處理程序調用頂層事件處理程序此處需注意

  private void AddBtn_Click(Object sender EventArgs e)

  {

  thisValue++; OnChange(EventArgsEmpty);

  }

  ASPNET復合控件事件冒泡法

  上面已經介紹過了並且MSDN也已經作出了詳細的解釋控件可以將其定義的事件上傳到控件頂層在引發事件時處理事件了解冒泡法你需要了解以下兩個方法

  protected virtual bool OnBubbleEvent(     object source     EventArgs args  );

  protected void RaiseBubbleEvent(     object source     EventArgs args   );

  RaiseBubbleEvent不可重寫用於向上傳遞數據

  要引發冒泡事件控件必重寫 OnBubbleEvent 看OnBubbleEvent方法看下面代碼

  你需要先熟悉一下CommandEventArgs其為Command事件提供了數據通過其可以訪問控件命令名稱和參數並根據不同參數和名稱觸發不同事件其下代碼為上一篇登錄控件例子實現事件冒泡的方法具體代碼可在最後下載且CreateChildControls方法中的觸發事件的控件無須添加一個事件委托

  addButtonClick += new EventHandler(thisAddBtn_Click);

  protected override bool OnBubbleEvent(object source EventArgs e)

  {

  bool handled = false;

  if (e is CommandEventArgs)

  {

  CommandEventArgs ce = (CommandEventArgs)e;

  if (ceCommandName == Logon)

  {

  OnLogon(EventArgsEmpty);

  handled = true;

  }

  }

  return handled;

  }

  你也可以為控件定義的事件定義事件冒泡引發該時間則必須調用RaiseBubbleEvent示例三就是具體的例子使用

  protected virtual void OnCommand(CommandEventArgs e)

  {

  CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];

  if (handler != null)

  handler(thise);

  // The Command event is bubbled up the control hierarchy

  RaiseBubbleEvent(this e);

  }

  本次講的重點在於冒泡法的使用但我卻用很多篇幅介紹寫前面的東西主要目的是為了讓大家用復合控件與非符合控件進行比較總的來說復合控件為我們帶來了便利不用實現IPostBackEventHandler接口簡化了操作如果大家熟悉事件回傳機制則不難了解冒泡法的使用最後還是要注意一點的是復合控件是一個樹級的控件即由子控件組成的一個控件這次的例子很多都是直接取自書上和微軟的教程上只供大家參考吧

  好了這次就寫到這裡感覺這次寫的並不是太好望見諒有錯誤請指出

  ASPNET控件開發基礎之復合控件事件處理的基本情況就向你介紹到這裡希望對你理解ASPNET控件開發基礎之復合控件事件有所幫助


From:http://tw.wingwit.com/Article/program/net/201311/13502.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.