成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

對于ASP.NET控件開發基礎的學習首先我們先明白些內容:

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

(1) 直接實現按鈕事件

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

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

  1. void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)  
  2. {  
  3. if (eventArgument == "Previous")  
  4. PreviousText = "你點擊了PreviousText按鈕";  
  5. else if (eventArgument == "Next")  
  6. NextText = "你點擊了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();  

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

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

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

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

Page.GetPostBackEventReference方法用來傳遞參數

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

小結:

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

(2)以自定義事件實現

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

ASP.NET控件開發基礎示例二

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

調用代碼如下

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

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

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

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

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

ASP.NET控件開發基礎示例三

  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 = "你點擊了左按鈕";  
  11. }  
  12.  
  13. protected void Button2_Click(object sender, EventArgs e)  
  14. {  
  15. Label1.Text = "你點擊了右按鈕";  
  16. }  
  17.  
  18. protected void btn_command(object sender, CommandEventArgs e)  
  19. {  
  20. switch (e.CommandName)  
  21. {  
  22. case "left":  
  23. Label2.Text = "你點擊了左按鈕";  
  24. break;  
  25. case "right":  
  26. Label2.Text = "你點擊了右按鈕";  
  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﹥無標題頁﹤/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﹥ 

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

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

1.直接實現按鈕事件

2.以自定義事件實現

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

ASP.NET控件開發基礎示例四

  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. }  

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

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

1.包含法

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

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

ASP.NET控件開發基礎示例五

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

2.ASP.NET復合控件事件冒泡法

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

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

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

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

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

  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.         } 

你也可以為控件定義的事件定義事件冒泡,引發該時間則必須調用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.         } 

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

好了,這次就寫到這里,感覺這次寫的并不是太好,望見諒,有錯誤請指出.

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

【編輯推薦】

  1. ASP.NET服務器控件之RenderContents應用示例
  2. ASP.NET控件開發基礎之RenderContents使用淺析
  3. ASP.NET自定義控件屬性淺析
  4. ASP.NET控件開發基礎之自定義控件樣式屬性淺析
  5. ASP.NET控件開發基礎之復合控件淺析
責任編輯:仲衡 來源: 博客園
相關推薦

2009-08-06 18:18:27

ASP.NET控件開發ASP.NET復合控件

2009-07-30 16:52:38

復合控件ASP.NET服務器控

2009-08-06 13:08:23

ASP.NET控件開發

2009-08-07 15:24:16

ASP.NET模板控件

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發

2009-08-07 15:45:26

ASP.NET復合控件數據綁定

2009-07-27 17:25:53

ASP.NET驗證控件

2009-08-07 15:34:15

ASP.NET數據綁定

2009-08-07 14:05:21

ASP.NET控件

2009-08-06 17:52:45

ASP.NET控件開發自定義控件

2009-08-06 10:49:45

ASP.NET服務器控

2009-08-06 15:21:45

ASP.NET控件開發RenderConte

2009-07-28 09:32:41

ASP.NET自定義控

2009-08-07 17:49:44

控件設計器

2009-08-07 15:32:28

ASP.NET復合控件

2009-08-07 15:40:10

CompositeCo復合控件

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-07 09:33:23

ASP.NET控件開發

2009-08-07 10:34:56

ASP.NET控件開發

2009-08-07 13:31:41

ASP.NET控件開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品在线观看视频 | 欧美日韩视频在线第一区 | 日韩精品一二三区 | 欧美一级免费看 | 精品亚洲一区二区三区 | 丁香一区二区 | 亚洲精品视频一区二区三区 | 久久视频一区 | 国产成人精品久久二区二区91 | 国产精品美女久久久久久久久久久 | 精品欧美一区二区三区久久久 | 干出白浆视频 | 亚洲精品久久久蜜桃 | 大象一区 | 午夜精品久久 | 日韩二区三区 | 一区二区三区四区国产 | 99精品99| 中文字幕在线观看成人 | 国产精品一区网站 | 伊人网综合 | 乱码av午夜噜噜噜噜动漫 | 久久一区二区av | 国产精品欧美一区二区三区不卡 | 亚洲精品欧美 | 中文字幕在线观看一区二区 | 九九热精品在线 | 日韩免费网站 | 国产精品亚洲片在线播放 | 久久久久久久久久久久久久久久久久久久 | 国产一区2区 | 91影视 | 日韩2020狼一二三 | 亚洲aⅴ精品 | 在线免费激情视频 | 亚洲高清在线 | 91视频一区二区 | 亚洲性爰 | 久久综合九色综合欧美狠狠 | 亚洲天堂一区二区 | 欧美日韩视频 |