日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

事件冒泡控件示例(转载)

發布時間:2023/12/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 事件冒泡控件示例(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.NET?Framework?開發員指南?

事件冒泡

ASP.NET 頁框架提供一種稱為“事件冒泡”的技術,允許子控件將事件沿其包容層次結構向上傳播。事件冒泡允許在控件層次結構中更方便的位置引發事件,并且允許將事件處理程序附加到原始控件以及公開冒泡的事件的控件上。

數據綁定控件(Repeater、DataList 和 DataGrid)使用事件冒泡將子控件(在項目模板內)引發的命令事件公開為頂級事件。雖然 .NET Framework 中的 ASP.NET 服務器控件將事件冒泡用于命令事件(事件數據類是從 CommandEventArgs 派生的事件),但是,服務器控件上定義的任何事件都可以冒泡。

控件可以通過從基類 System.Web.UI.Control 繼承的兩個方法參與事件冒泡。這兩個方法是:OnBubbleEvent 和 RaiseBubbleEvent。以下代碼片段顯示了這些方法的簽名。

[C#] protected virtual bool OnBubbleEvent(object source,EventArgs args ); protected void RaiseBubbleEvent(object source,EventArgs args ); [Visual?Basic] Overridable Protected Function OnBubbleEvent( _ByVal source As Object, _ByVal args As EventArgs _ ) As Boolean Protected Sub RaiseBubbleEvent( _ByVal source As Object, _ByVal args As EventArgs _ )

RaiseBubbleEvent 的實現是由 Control 提供的,并且不能被重寫。RaiseBubbleEvent 沿層次結構向上將事件數據發送到控件的父級。若要處理或引發冒泡的事件,控件必須重寫 OnBubbleEvent 方法。

使事件冒泡的控件執行以下三種操作之一。

  • 控件不執行任何操作,此時事件自動向上冒泡到其父級。
  • 控件進行一些處理并繼續使事件冒泡。若要實現這一點,控件必須重寫 OnBubbleEvent,并從 OnBubbleEvent 調用 RaiseBubbleEvent。以下代碼片段(摘自模板化數據綁定控件示例)在檢查事件參數的類型后使事件冒泡。 [C#] protected override bool OnBubbleEvent(object source, EventArgs e) {if (e is CommandEventArgs) {// Adds information about an Item to the // CommandEvent.TemplatedListCommandEventArgs args =new TemplatedListCommandEventArgs(this, source, (CommandEventArgs)e);RaiseBubbleEvent(this, args);return true;}return false;} [Visual?Basic] Protected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As BooleanIf TypeOf e Is CommandEventArgs Then' Adds information about an Item to the ' CommandEvent.Dim args As New TemplatedListCommandEventArgs(Me, source, CType(e, CommandEventArgs))RaiseBubbleEvent(Me, args)Return TrueEnd IfReturn False End Function
  • 控件停止事件冒泡并引發和/或處理該事件。引發事件需要調用將事件調度給偵聽器的方法。若要引發冒泡的事件,控件必須重寫 OnBubbleEvent 以調用引發此冒泡的事件的 OnEventName 方法。引發冒泡的事件的控件通常將冒泡的事件公開為頂級事件。以下代碼片段(摘自模板化數據綁定控件示例)引發一個冒泡的事件。 [C#] protected override bool OnBubbleEvent(object source, EventArgs e) {bool handled = false;if (e is TemplatedListCommandEventArgs) {TemplatedListCommandEventArgs ce = (TemplatedListCommandEventArgs)e;OnItemCommand(ce);handled = true;}return handled; } [Visual?Basic] Protected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As BooleanDim handled As Boolean = FalseIf TypeOf e Is TemplatedListCommandEventArgs ThenDim ce As TemplatedListCommandEventArgs = CType(e, TemplatedListCommandEventArgs)OnItemCommand(ce)handled = TrueEnd IfReturn handled End Function

有關說明事件冒泡的示例,請參見事件冒泡控件示例和模板化數據綁定控件示例。

注意???雖然啟用事件冒泡的方法 OnBubbleEvent 符合用于引發事件的方法的標準 .NET Framework 命名模式,但是沒有名為 BubbleEvent 的事件。在停止事件冒泡的控件中,將冒泡事件公開為頂級事件。例如,DataList 控件將其模板中控件的 Command 事件公開為 ItemCommand 事件。另請注意,在 .NET Framework 中 OnEventName 方法的標準簽名有一個參數 (protected void OnEventName (EventArgs e))。但是,OnBubbleEvent 有兩個參數,這是因為該事件起源于控件之外;第二個參數提供源。

到目前為止,本討論說明了控件如何響應冒泡的事件。下面一節顯示如何創作一個定義冒泡的事件的控件。

定義冒泡的事件

如果希望控件為它所定義的事件啟用事件冒泡,則控件必須從引發該事件的 OnEventName 方法調用 RaiseBubbleEvent。不需要在該控件中做額外的工作。以下代碼片段顯示了一個控件,該控件定義了一個啟用冒泡的 Command 事件。

[C#] protected virtual void OnCommand(CommandEventArgs e) {CommandEventHandler handler = (CommandEventHandler)Events[EventCommand];if (handler != null)handler(this,e);// The Command event is bubbled up the control hierarchy.RaiseBubbleEvent(this, e);} [Visual?Basic] Protected Overridable Sub OnCommand(e As CommandEventArgs)Dim handler As CommandEventHandler = CType(Events(EventCommand), CommandEventHandler)If Not (handler Is Nothing) Thenhandler(Me, e)End If ' The Command event is bubbled up the control hierarchy.RaiseBubbleEvent(Me, e) End Sub 注意???事件冒泡并不限于命令事件。可以使用此處描述的機制使任何事件冒泡。

請參見

事件冒泡控件示例 | 模板化數據綁定控件示例


事件冒泡控件示例

下面的自定義控件 EventBubbler 說明了一種簡單的事件冒泡情況。EventBubbler 是一個包含文本框 (TextBox)、按鈕 (Button) 和標簽 (Label) 控件的復合控件。EventBubbler 將命令事件從按鈕冒泡到父容器控件(自身),并將它們公開為頂級事件。若要生成該示例,請參見服務器控件示例中的說明。

有關更切合實際的示例,請參見模板化數據綁定控件示例。

[C#] using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;namespace CustomControls {public class EventBubbler : Control, INamingContainer {private int number = 100;private Label label;private TextBox box1;private TextBox box2;public event EventHandler Click;public event EventHandler Reset;public event EventHandler Submit;public string Label{get{EnsureChildControls();return label.Text;}set{EnsureChildControls();label.Text = value;}}public int Number{get{return number;}set{number = value;}}public string Text1{get{EnsureChildControls();return box1.Text;}set{EnsureChildControls();box1.Text = value;}}public string Text2{get{EnsureChildControls();return box2.Text;}set{EnsureChildControls();box2.Text = value;}}protected override void CreateChildControls() {Controls.Add(new LiteralControl("<h3>Enter a number : "));box1 = new TextBox();box1.Text = "0";Controls.Add(box1);Controls.Add(new LiteralControl("</h3>"));Controls.Add(new LiteralControl("<h3>Enter another number : "));box2 = new TextBox();box2.Text = "0";Controls.Add(box2);Controls.Add(new LiteralControl("</h3>"));Button button1 = new Button();button1.Text = "Click";button1.CommandName = "Click";Controls.Add(button1);Button button2 = new Button();button2.Text = "Reset";button2.CommandName = "Reset";Controls.Add(button2);Button button3 = new Button();button3.Text = "Submit";button3.CommandName = "Submit";Controls.Add(button3);Controls.Add(new LiteralControl("<br><br>"));label = new Label();label.Height = 50;label.Width = 500;label.Text = "Click a button.";Controls.Add(label);}protected override bool OnBubbleEvent(object source, EventArgs e) { bool handled = false;if (e is CommandEventArgs){CommandEventArgs ce = (CommandEventArgs)e;if (ce.CommandName == "Click"){OnClick(ce);handled = true; } else if (ce.CommandName == "Reset"){OnReset(ce);handled = true; }else if (ce.CommandName == "Submit"){OnSubmit(ce);handled = true; }}return handled; }protected virtual void OnClick (EventArgs e){if (Click != null){Click(this,e);}}protected virtual void OnReset (EventArgs e){if (Reset != null){Reset(this,e);}}protected virtual void OnSubmit (EventArgs e){if (Submit != null){Submit(this,e);}} } } [Visual?Basic] Option Explicit Option StrictImports System Imports System.Web Imports System.Web.UI Imports System.Web.UI.WebControlsNamespace CustomControlsPublic Class EventBubblerInherits ControlImplements INamingContainerPrivate _number As Integer = 100Private _label As LabelPrivate _box1 As TextBoxPrivate _box2 As TextBoxPublic Event Click As EventHandlerPublic Event Reset As EventHandlerPublic Event Submit As EventHandlerPublic Property Label() As StringGetEnsureChildControls()Return _label.TextEnd GetSetEnsureChildControls()_label.Text = valueEnd SetEnd PropertyPublic Property Number() As IntegerGetReturn _numberEnd GetSet_number = valueEnd SetEnd PropertyPublic Property Text1() As StringGetEnsureChildControls()Return _box1.TextEnd GetSetEnsureChildControls()_box1.Text = valueEnd SetEnd PropertyPublic Property Text2() As StringGetEnsureChildControls()Return _box2.TextEnd GetSetEnsureChildControls()_box2.Text = valueEnd SetEnd PropertyProtected Overrides Sub CreateChildControls()Controls.Add(New LiteralControl("<h3>Enter a number : "))_box1 = New TextBox()_box1.Text = "0"Controls.Add(_box1)Controls.Add(New LiteralControl("</h3>"))Controls.Add(New LiteralControl("<h3>Enter another number : "))_box2 = New TextBox()_box2.Text = "0"Controls.Add(_box2)Controls.Add(New LiteralControl("</h3>"))Dim button1 As New Button()button1.Text = "Click"button1.CommandName = "Click"Controls.Add(button1)Dim button2 As New Button()button2.Text = "Reset"button2.CommandName = "Reset"Controls.Add(button2)Dim button3 As New Button()button3.Text = "Submit"button3.CommandName = "Submit"Controls.Add(button3)Controls.Add(New LiteralControl("<br><br>"))_label = New Label()_label.Height = Unit.Pixel(50)_label.Width = Unit.Pixel(500)_label.Text = "Click a button."Controls.Add(_label)End SubProtected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As BooleanDim handled As Boolean = FalseIf TypeOf e Is CommandEventArgs ThenDim ce As CommandEventArgs = CType(e, CommandEventArgs)If ce.CommandName = "Click" ThenOnClick(ce)handled = TrueElseIf ce.CommandName = "Reset" ThenOnReset(ce)handled = TrueElseIf ce.CommandName = "Submit" ThenOnSubmit(ce)handled = TrueEnd IfEnd If End IfEnd IfReturn handledEnd FunctionProtected Overridable Sub OnClick(e As EventArgs)RaiseEvent Click(Me, e)End SubProtected Overridable Sub OnReset(e As EventArgs)RaiseEvent Reset(Me, e)End SubProtected Overridable Sub OnSubmit(e As EventArgs)RaiseEvent Submit(Me, e)End SubEnd Class End Namespace

在頁上使用事件冒泡控件

下面的 ASP.NET 頁使用自定義事件冒泡控件 EventBubbler,并將事件處理程序附加到其頂級事件。

[C#] <%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %> <html> <script language="C#" runat=server>private void ClickHandler(Object sender,EventArgs e){MyControl.Label = "You clicked the <b> Click </b> button";}private void ResetHandler(Object sender,EventArgs e){MyControl.Text1 = "0";MyControl.Text2 = "0"; } private void SubmitHandler(Object sender,EventArgs e){if ( Int32.Parse(MyControl.Text1) + Int32.Parse(MyControl.Text2) == MyControl.Number)MyControl.Label = "<h2> You won a million dollars!!!! </h2>";else MyControl.Label = "Sorry, try again. The numbers you entered don't add up to" +" the hidden number.";} </script><body><h1> The Mystery Sum Game </h1><br><form runat=server> <Custom:EventBubbler id = "MyControl" OnClick = "ClickHandler" OnReset = "ResetHandler" OnSubmit = "SubmitHandler" Number= "10" runat = server/> </form> </body> </html> [Visual?Basic] <%@ Register TagPrefix="Custom" Namespace="CustomControls" Assembly = "CustomControls" %> <html> <script language="VB" runat=server>Private Sub ClickHandler(sender As Object, e As EventArgs)MyControl.Label = "You clicked the <b> Click </b> button"End SubPrivate Sub ResetHandler(sender As Object, e As EventArgs)MyControl.Text1 = "0"MyControl.Text2 = "0"End SubPrivate Sub SubmitHandler(sender As Object, e As EventArgs)If Int32.Parse(MyControl.Text1) + Int32.Parse(MyControl.Text2) = MyControl.Number ThenMyControl.Label = "<h2> You won a million dollars!!!! </h2>"ElseMyControl.Label = "Sorry, try again. The numbers you entered don't add up to" & " the hidden number."End IfEnd Sub </script><body><h1> The Mystery Sum Game </h1><br><form runat=server> <Custom:EventBubbler id = "MyControl" OnClick = "ClickHandler" OnReset = "ResetHandler" OnSubmit = "SubmitHandler" Number= "10" runat = server/> </form> </body> </html>

轉載于:https://www.cnblogs.com/laiwen/archive/2005/08/05/207921.html

總結

以上是生活随笔為你收集整理的事件冒泡控件示例(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。