自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件事件處理淺析

開發(fā) 后端
ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件事件處理主要向你講述的是ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件事件處理的事件冒泡情況。

上一篇寫了ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件基本的概念,這次就繼續(xù)上次的話題,來學(xué)習(xí)ASP.NET復(fù)合控件如何觸發(fā)事件.

對(duì)于ASP.NET控件開發(fā)基礎(chǔ)的學(xué)習(xí)首先我們先明白些內(nèi)容:

有一些ASP.NET復(fù)合控件直接把按鈕觸發(fā)事件所需的事情封裝好,另外一種則是自定義事件,更具靈活性,當(dāng)然這是根據(jù)需要設(shè)計(jì)的。以下會(huì)以例子來說明的.下面我們假設(shè)我們控件中有兩個(gè)按鈕.以下不列出所有代碼,具體可在文章***下載代碼.

(1) 直接實(shí)現(xiàn)按鈕事件

在控件中(以下代碼并非實(shí)現(xiàn)復(fù)合控件)直接實(shí)現(xiàn)事件則無需自定義事件,如下代碼(如果對(duì)數(shù)據(jù)回傳有些不熟悉的話,可先看第三篇,希望對(duì)你有幫助)

ASP.NET控件開發(fā)基礎(chǔ)示例一(只列出局部代碼,具體可在文章***下載代碼)

  1. void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)  
  2. {  
  3. if (eventArgument == "Previous")  
  4. PreviousText = "你點(diǎn)擊了PreviousText按鈕";  
  5. else if (eventArgument == "Next")  
  6. NextText = "你點(diǎn)擊了NextText按鈕";  
  7. }  
  8.  
  9. protected override void RenderContents(HtmlTextWriter writer)  
  10. {  
  11. writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.GetPostBackEventReference(this"Previous"));  
  12. writer.RenderBeginTag(HtmlTextWriterTag.Button);  
  13. writer.Write(this.PreviousText);  
  14. writer.RenderEndTag();  
  15.  
  16. writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.GetPostBackEventReference(this"Next"));  
  17. writer.RenderBeginTag(HtmlTextWriterTag.Button);  
  18. writer.Write(this.NextText);  
  19. writer.RenderEndTag();  

還記得第三篇時(shí)示例一中下面的代碼嗎?此控件中只觸發(fā)了一個(gè)事件,所以無需根據(jù)服務(wù)器傳遞的參數(shù)來判斷出發(fā)哪個(gè)事件

  1. //實(shí)現(xiàn)RaisePostBackEvent方法,處理回發(fā)事件  
  2. public void RaisePostBackEvent(string eventArgument)  
  3. {  
  4. OnClick(EventArgs.Empty);  

RaisePostBackEvent方法有一個(gè)eventArgument參數(shù)用來傳遞事件數(shù)據(jù).代碼實(shí)現(xiàn)了一個(gè)空參數(shù)傳遞(eventArgument參數(shù)為空)的事件OnClick(EventArgs.Empty)

再比較一下示例一的代碼,因?yàn)槠溆玫搅藘蓚€(gè)按鈕

Page.GetPostBackEventReference方法用來傳遞參數(shù)

RaisePostBackEvent方法則以傳遞參數(shù)來判斷觸發(fā)哪個(gè)按鈕

小結(jié):

在控件中直接實(shí)現(xiàn)按鈕事件,則無需定義自定義事件,但別忘了在RaisePostBackEvent方法中根據(jù)傳遞過來的不同參數(shù)來加以判斷.

(2)以自定義事件實(shí)現(xiàn)

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

ASP.NET控件開發(fā)基礎(chǔ)示例二

  1. void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)  
  2. {  
  3. if (eventArgument == "Previous")  
  4. OnClickPrevious(EventArgs.Empty);  
  5. else if (eventArgument == "Next")  
  6. OnClickNext(EventArgs.Empty);  

調(diào)用代碼如下

  1. protected void NavButtons2_1_ClickPrevious(object sender, EventArgs e)  
  2. {  
  3. Label1.Text = "你點(diǎn)擊了PreviousText按鈕";  
  4. }  
  5.  
  6. protected void NavButtons2_1_ClickNext(object sender, EventArgs e)  
  7. {  
  8. Label1.Text = "你點(diǎn)擊了NextText按鈕";  

小結(jié):在示例一的基礎(chǔ)上去除直接實(shí)現(xiàn)好的按鈕事件,然后自定義事件.

再次提醒如果大家對(duì)回發(fā)事件,還請(qǐng)?jiān)賲⒖家恍┪恼孪扰宄?或者也可以看看我寫的第三篇文章.

好了,上面講的都非復(fù)合控件,但復(fù)合控件實(shí)現(xiàn)起來卻很相似,或者可以說更加簡單.

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

ASP.NET控件開發(fā)基礎(chǔ)示例三

  1. ﹤%@ Page Language="C#" %﹥  
  2.  
  3. ﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  4.  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥  
  5.  
  6. ﹤script runat="server"﹥  
  7.  
  8. protected void Button1_Click(object sender, EventArgs e)  
  9. {  
  10. Label1.Text = "你點(diǎn)擊了左按鈕";  
  11. }  
  12.  
  13. protected void Button2_Click(object sender, EventArgs e)  
  14. {  
  15. Label1.Text = "你點(diǎn)擊了右按鈕";  
  16. }  
  17.  
  18. protected void btn_command(object sender, CommandEventArgs e)  
  19. {  
  20. switch (e.CommandName)  
  21. {  
  22. case "left":  
  23. Label2.Text = "你點(diǎn)擊了左按鈕";  
  24. break;  
  25. case "right":  
  26. Label2.Text = "你點(diǎn)擊了右按鈕";  
  27. break;  
  28. }  
  29. }  
  30.  
  31. protected void btn2_command(object sender, CommandEventArgs e)  
  32. {  
  33. switch (e.CommandName)  
  34. {  
  35. case "left":  
  36. Button1_Click(this, e);  
  37. break;  
  38. case "right":  
  39. Button2_Click(this, e);  
  40. break;  
  41. }  
  42. }  
  43. ﹤/script﹥  
  44.  
  45. ﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥  
  46. ﹤head runat="server"﹥  
  47. ﹤title﹥無標(biāo)題頁﹤/title﹥  
  48. ﹤/head﹥  
  49. ﹤body﹥  
  50. ﹤form id="form1" runat="server"﹥  
  51. ﹤div﹥  
  52. ﹤asp:Button ID="Button1" runat="server"   
  53. OnClick="Button1_Click" Text="左按鈕" /﹥  
  54. ﹤asp:Button ID="Button2" runat="server" Text="右按鈕" 
  55.  OnClick="Button2_Click" /﹥﹤br /﹥  
  56. ﹤br /﹥  
  57. ﹤asp:Label ID="Label1" runat="server"﹥﹤/asp:Label﹥﹤br /﹥  
  58. ﹤br /﹥  
  59. ﹤asp:Button ID="Button3" runat="server" Text="左按鈕"   
  60. CommandName="left" OnCommand="btn_command" /﹥  
  61. ﹤asp:Button ID="Button4" runat="server" 
  62. Text="右按鈕" OnCommand="btn_command" CommandName="right" /﹥﹤br /﹥  
  63. ﹤br /﹥  
  64. ﹤asp:Label ID="Label2" runat="server"﹥﹤/asp:Label﹥﹤br /﹥  
  65. ﹤br /﹥  
  66. ﹤asp:Button ID="Button5" runat="server" Text="左按鈕"   
  67. CommandName="left" OnCommand="btn2_command" /﹥  
  68. ﹤asp:Button ID="Button6" runat="server" 
  69. Text="右按鈕" OnCommand="btn2_command" CommandName="right" /﹥﹤/div﹥  
  70. ﹤/form﹥  
  71. ﹤/body﹥  
  72. ﹤/html﹥ 

以上代碼以三種方式來實(shí)現(xiàn)按鈕的觸發(fā)事件.這里本應(yīng)該再舉一個(gè)數(shù)據(jù)綁定控件如(DataList控件的使用)的一個(gè)例子的一個(gè)例子的,這里目的只為了說明冒泡法的使用,冒泡法在DataList等數(shù)據(jù)綁定控定控件中最能體現(xiàn)出來.

那我們先來看下,在ASP.NET復(fù)合控件中怎么做?

1.直接實(shí)現(xiàn)按鈕事件

2.以自定義事件實(shí)現(xiàn)

(1)以下為微軟網(wǎng)站的示例代碼,如下代碼

ASP.NET控件開發(fā)基礎(chǔ)示例四

  1. namespace CompositionSampleControls  
  2. {  
  3.  
  4. public class Composition2 : Control, INamingContainer  
  5. {  
  6.  
  7. public int Value  
  8. {  
  9. get 
  10. {  
  11. this.EnsureChildControls();  
  12. return Int32.Parse(((TextBox)Controls[1]).Text);  
  13. }  
  14. set 
  15. {  
  16. this.EnsureChildControls();  
  17. ((TextBox)Controls[1]).Text = value.ToString();  
  18. }  
  19. }  
  20.  
  21. protected override void CreateChildControls()  
  22. {  
  23.  
  24. // Add Literal Control  
  25.  
  26. this.Controls.Add(new LiteralControl("﹤h3﹥" + "Value: "));  
  27.  
  28. // Add Textbox  
  29.  
  30. TextBox box = new TextBox();  
  31. box.Text = "0";  
  32. this.Controls.Add(box);  
  33.  
  34. // Add Literal Control  
  35.  
  36. this.Controls.Add(new LiteralControl("﹤/h3﹥"));  
  37.  
  38. // Add "Add" Button  
  39.  
  40. Button addButton = new Button();  
  41. addButton.Text = "Add";  
  42. addButton.Click += new EventHandler(this.AddBtn_Click);  
  43. this.Controls.Add(addButton);  
  44.  
  45. // Add Literal Control  
  46.  
  47. this.Controls.Add(new LiteralControl(" | "));  
  48.  
  49. // Add "Subtract" Button  
  50.  
  51. Button subtractButton = new Button();  
  52. subtractButton.Text = "Subtract";  
  53. subtractButton.Click += new EventHandler(this.SubtractBtn_Click);  
  54. this.Controls.Add(subtractButton);  
  55.  
  56. }  
  57.  
  58. private void AddBtn_Click(Object sender, EventArgs e)  
  59. {  
  60. this.Value++;  
  61. }  
  62.  
  63. private void SubtractBtn_Click(Object sender, EventArgs e)  
  64. {  
  65. this.Value--;  
  66. }  
  67. }  

因?yàn)閮?nèi)部事件已經(jīng)實(shí)現(xiàn)好了,所以比較簡單,相信大家都看的懂。

再看復(fù)合控件的自定義事件,這里才是我們所要講的重點(diǎn).通常我們提倡在復(fù)合控件中采用冒泡法實(shí)現(xiàn)事件的上傳,上一篇已經(jīng)說過了,復(fù)合控件是一個(gè)樹結(jié)構(gòu)的控件,最典型的就是asp.net的數(shù)據(jù)邦定控件(特殊的復(fù)合控件)了如DataList,此控件有很多以Command結(jié)尾的事件,我們剛開始學(xué)這個(gè)控件的時(shí)候,總要考慮,如何在此控件中實(shí)現(xiàn)按鈕事件,所采用的就是我們常說的"事件冒泡",當(dāng)然還有另一種方法,應(yīng)該說是普通的實(shí)現(xiàn)方法,asp.net服務(wù)器控件開發(fā)技術(shù)與示例稱之為包含法,下面我們以例子來說明上面兩種方法.

1.包含法

還是以微軟的快速入門教程的代碼為例.與上面的代碼對(duì)比有幾處變動(dòng),如下

注意粗體字,自定義事件為復(fù)合控件頂層的事件,而非其子控件button按鈕的事件,button按鈕的事件需調(diào)用頂層事件處理程序.即實(shí)現(xiàn)子控件事件上傳的過程.

ASP.NET控件開發(fā)基礎(chǔ)示例五

  1. //自定義事件  
  2. public event EventHandler Change;  
  3. //自定義事件處理程序  
  4. protected void OnChange(EventArgs e) { Change(this, e); }  
  5. //子控件事件處理程序調(diào)用頂層事件處理程序,此處需注意  
  6. private void AddBtn_Click(Object sender, EventArgs e)   
  7. this.Value++; OnChange(EventArgs.Empty); }  

2.ASP.NET復(fù)合控件事件冒泡法

上面已經(jīng)介紹過了,并且MSDN也已經(jīng)作出了詳細(xì)的解釋,控件可以將其定義的事件上傳到控件頂層,在引發(fā)事件時(shí)處理事件,了解冒泡法,你需要了解以下兩個(gè)方法

  1. protected virtual bool OnBubbleEvent(  
  2.    object source,  
  3.    EventArgs args  
  4. );  
  5. protected void RaiseBubbleEvent(  
  6.    object source,  
  7.    EventArgs args   
  8. ); 

RaiseBubbleEvent不可重寫,用于向上傳遞數(shù)據(jù)

要引發(fā)冒泡事件,控件必重寫 OnBubbleEvent 看OnBubbleEvent方法,看下面代碼

你需要先熟悉一下CommandEventArgs,其為Command事件提供了數(shù)據(jù),通過其可以訪問控件命令名稱和參數(shù),并根據(jù)不同參數(shù)和名稱觸發(fā)不同事件.其下代碼為上一篇登錄控件例子實(shí)現(xiàn)事件冒泡的方法,具體代碼可在***下載,且CreateChildControls方法中的觸發(fā)事件的控件無須添加一個(gè)事件委托

  1.  
  2. addButton.Click += new EventHandler(this.AddBtn_Click);  
  3.  
  4.   protected override bool OnBubbleEvent(object source, EventArgs e) {     
  5.        bool handled = false;  
  6.         if (e is CommandEventArgs) {  
  7.             CommandEventArgs ce = (CommandEventArgs)e;  
  8.            if (ce.CommandName == "Logon") {  
  9.                OnLogon(EventArgs.Empty);  
  10.                handled = true;     
  11.                 }    
  12.             }  
  13.             return handled;              
  14.         } 

你也可以為控件定義的事件定義事件冒泡,引發(fā)該時(shí)間則必須調(diào)用RaiseBubbleEvent,示例三就是具體的例子使用

  1. protected virtual void OnCommand(CommandEventArgs e) {  
  2.      CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];  
  3.             if (handler != null)  
  4.                 handler(this,e);  
  5.  
  6.             // The Command event is bubbled up the control hierarchy.  
  7.             RaiseBubbleEvent(this, e);  
  8.         } 

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

好了,這次就寫到這里,感覺這次寫的并不是太好,望見諒,有錯(cuò)誤請(qǐng)指出.

ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件事件處理的基本情況就向你介紹到這里,希望對(duì)你理解ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件事件有所幫助。

【編輯推薦】

  1. ASP.NET服務(wù)器控件之RenderContents應(yīng)用示例
  2. ASP.NET控件開發(fā)基礎(chǔ)之RenderContents使用淺析
  3. ASP.NET自定義控件屬性淺析
  4. ASP.NET控件開發(fā)基礎(chǔ)之自定義控件樣式屬性淺析
  5. ASP.NET控件開發(fā)基礎(chǔ)之復(fù)合控件淺析
責(zé)任編輯:仲衡 來源: 博客園
相關(guān)推薦

2009-08-06 18:18:27

ASP.NET控件開發(fā)ASP.NET復(fù)合控件

2009-07-30 16:52:38

復(fù)合控件ASP.NET服務(wù)器控

2009-08-06 13:08:23

ASP.NET控件開發(fā)

2009-08-07 15:24:16

ASP.NET模板控件

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發(fā)

2009-08-07 15:45:26

ASP.NET復(fù)合控件數(shù)據(jù)綁定

2009-08-07 15:34:15

ASP.NET數(shù)據(jù)綁定

2009-07-27 17:25:53

ASP.NET驗(yàn)證控件

2009-08-07 14:05:21

ASP.NET控件

2009-08-06 17:52:45

ASP.NET控件開發(fā)自定義控件

2009-08-06 10:49:45

ASP.NET服務(wù)器控

2009-07-28 09:32:41

ASP.NET自定義控

2009-08-07 17:49:44

控件設(shè)計(jì)器

2009-08-06 15:21:45

ASP.NET控件開發(fā)RenderConte

2009-08-07 15:32:28

ASP.NET復(fù)合控件

2009-08-07 15:40:10

CompositeCo復(fù)合控件

2009-08-07 09:33:23

ASP.NET控件開發(fā)

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-07 13:31:41

ASP.NET控件開發(fā)

2009-08-07 10:34:56

ASP.NET控件開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)