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

.NET Framework 开发员指南 

事件冒泡

ASP.NET 页框架提供一种称为“事件冒泡”的技术,允许子控件将事件沿其包容层次结构向上传播。事件冒泡允许在控件层次结构中更方便的位置引发事件,并且允许将事件处理程序附加到原始控件以及公开冒泡的事件的控件上。

数据绑定控件(Repeater、DataList 和 DataGrid)使用事件冒泡将子控件(在项目模板内)引发的命令事件公开为顶级事件。虽然 .NET Framework 中的 ASP.NET 服务器控件将事件冒泡用于命令事件(事件数据类是从 CommandEventArgs 派生的事件),但是,服务器控件上定义的任何事件都可以冒泡。

控件可以通过从基类 System.Web.UI.Control 继承的两个方法参与事件冒泡。这两个方法是:OnBubbleEventRaiseBubbleEvent。以下代码片段显示了这些方法的签名。

[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 大规模裁员进行时:营收暴跌 28%,数据库地位被侵蚀

源 | InfoQ裁员潮席卷国外大厂&#xff0c;数据库巨头 Oracle 也不例外。“我的经理给我打了 3 分钟的电话。毫无情感地告诉我&#xff1a;你的职位被取消了&#xff0c;人力资源部稍后会把细节发给你&#xff0c;再见。”“我在 CX 营销部门工作了 8 年。HR 昨天下午打电话给我…

Spring Boot中使用RabbitMQ

很久没有写Spring Boot的内容了&#xff0c;正好最近在写Spring Cloud Bus的内容&#xff0c;因为内容会有一些相关性&#xff0c;所以先补一篇关于AMQP的整合。 Message Broker与AMQP简介 Message Broker是一种消息验证、传输、路由的架构模式&#xff0c;其设计目标主要应用…

程序员面试金典 - 面试题 03.05. 栈排序(两栈)

1. 题目 栈排序。 编写程序&#xff0c;对栈进行排序使最小元素位于栈顶。 最多只能使用一个其他的临时栈存放数据&#xff0c;但不得将元素复制到别的数据结构&#xff08;如数组&#xff09;中。 该栈支持如下操作&#xff1a;push、pop、peek 和 isEmpty。当栈为空时&#…

大足石刻一日游

今天早上9点半从重庆出发&#xff0c;11点半到的目的地。玩了3个小时&#xff0c;下午5点又回来了。逛了一会儿&#xff0c;感觉被骗了&#xff0c;没多少东西嘛&#xff0c;好多石刻都被风化的差不多了&#xff0c;1个小时就出来了&#xff0c;80块的门票真“值”。下面是手机…

为什么说工作期间需要摸鱼?

文 | 梦晨(发自凹非寺)源 | 量子位一努力思考就会精神疲惫&#xff0c;学习工作一天之后只想无脑躺平。最新研究发现&#xff0c;这并不是你一个人的错&#xff0c;而是有着普遍的生理基础&#xff1a;思考时脑内会产生一种毒素&#xff0c;积累太多会破坏大脑功能&#xff0c;…

Spring boot中使用log4j记录日志

之前在Spring Boot日志管理 一文中主要介绍了Spring Boot中默认日志工具&#xff08;logback&#xff09;的基本配置内容。对于很多习惯使用log4j的开发者&#xff0c;Spring Boot依然可以很好的支持&#xff0c;只是需要做一些小小的配置功能。 引入log4j依赖 在创建Spring …

4.7 【共享源】流的生产者(二)

七,模式 流的模式决定了Screen如何使前台缓冲区可用。生产者通过调用screen_set_stream_property_iv()并设置SCREEN_PROPERTY_MODE属性来设置模式。有效模式如下: 7.1 SCREEN_STREAM_MODE_DEFAULT 如果生产者应用程序没有在流上明确设置 SCREEN_PROPERTY_MODE 属性,则 Sc…

程序员面试金典 - 面试题 03.06. 动物收容所(队列)

1. 题目 动物收容所。有家动物收容所只收容狗与猫&#xff0c;且严格遵守“先进先出”的原则。 在收养该收容所的动物时&#xff0c;收养人只能收养所有动物中“最老”&#xff08;由其进入收容所的时间长短而定&#xff09;的动物&#xff0c;或者可以挑选猫或狗&#xff08…

Enterprise Blocks

我在Visual Studio .NET Web Control for Business Intelligence 中介绍的一个BI工具。支持DNN和SPS&#xff0c;太有心了&#xff01;找到一篇中文介绍文章。 Enterprise Blocks是ASP.NET Web控件、web服务、Windows服务的完整集合&#xff0c;在开发分析应用系统中可以作…

2022年竞赛打榜,神经网络还是干不过树模型??

文 | QvQ随着深度神经网络的不断发展&#xff0c;DNN在图像、文本和语音等类型的数据上都有了广泛的应用&#xff0c;然而对于同样非常常见的一种数据——表格数据&#xff0c;DNN却似乎并没有取得像它在其他领域那么大的成功。从Kaggle平台上对数据挖掘竞赛Top团队使用的工具统…

支持向量机(Support Vector Machines,SVM)

文章目录1. 线性可分SVM 与 硬间隔最大化1.1 线性可分SVM1.2 函数间隔、几何间隔1.3 间隔最大化2. 线性SVM 与 软间隔最大化2.1 线性SVM3. 非线性SVM 与 核函数3.1 核技巧/核函数3.2 常用核函数3.3 非线性SVM分类4. 序列最小最优化算法5. sklearn SVC 实例6. 课后习题支持向量机…

Bengio团队发起AI竞赛!

源 | AI4ClimateCoop比赛主办方&#xff1a;由MILA&#xff08;蒙特利尔人工智能实验室&#xff09;& Salesforce&#xff08;北美顶级云科技公司&#xff09;共同组织&#xff0c;由AI Economist团队领队Stephan Zheng博士和图灵奖得主Yoshua Bengio教授共同指导。比赛目标…

.NET Framework 1.1安装出现1935错误的解决办法

系统不知道什么原因&#xff0c;.NET Framework 1.1不能用了&#xff0c;得重装&#xff0c;但是重装了一次&#xff0c;每次老是提示错误1935&#xff0c;如图没有办法&#xff0c;上网查找相关资料&#xff0c;有文章介绍&#xff1a;“卸载Visual Studio .NET的预发布版之后…

ICLR Spotlight|Facebook提出无损INT8优化器,单机可以跑千亿参数模型了??

文 | 王思若2018年GPT、BERT预训练模型的提出吹响了大模型“军备竞赛”冲锋的号角&#xff0c;一场大模型的狂欢拉开帷幕&#xff0c;业界强大的算力支撑起例如Megatron-Turing、Switch Transformer、悟道2.0等千亿&万亿参数量模型。与此同时&#xff0c;面对着超大模型训练…

程序员面试金典 - 面试题 04.01. 节点间通路(图的遍历)

1. 题目 节点间通路。给定有向图&#xff0c;设计一个算法&#xff0c;找出两个节点之间是否存在一条路径。 示例1:输入&#xff1a;n 3, graph [[0, 1], [0, 2], [1, 2], [1, 2]],start 0, target 2输出&#xff1a;true 示例2:输入&#xff1a;n 5, graph [[0, 1], […

签名程序集密钥文件路径

在AssemblyInfo.cs 文件中 [assembly: AssemblyKeyFileAttribute("文件名")] 文件名是以解决方案.sln文件的路径为准的相对路径转载于:https://www.cnblogs.com/hjf1223/archive/2005/09/14/236590.html

华为天才少年谢凌曦:关于视觉识别领域发展的个人观点

文 | 谢凌曦知乎最近&#xff0c;我参加了几个高强度的学术活动&#xff0c;包括CCF计算机视觉专委会的闭门研讨会和VALSE线下大会。经过与其他学者的交流&#xff0c;我产生了许多想法&#xff0c;千头万绪&#xff0c;便希望把它们整理下来&#xff0c;供自己和同行们参考。当…

程序员面试金典 - 面试题 04.03. 特定深度节点链表(BFS)

1. 题目 给定一棵二叉树&#xff0c;设计一个算法&#xff0c;创建含有某一深度上所有节点的链表&#xff08;比如&#xff0c;若一棵树的深度为 D&#xff0c;则会创建出 D 个链表&#xff09;。返回一个包含所有深度的链表的数组。 例&#xff1a; 输入&#xff1a;[1,2,3,…

microsoft WINDOWS 系统错误代码 [收藏]

MS Windows Error Messages Code Error Message 0 操作成功完成。 1 功能错误。 2 系统找不到指定的文件。 3 系统找不到指定的路径。 4 系统无法打开文件。 5 拒绝访问。 6 句柄无效。 7 存储控制块被损坏。 8 存储空间不足&#xff0c;无法处理此命…

月薪3w算法工程师日均7行代码被开除 / AI歌手入学上海音乐学院 / 天文照片被植入恶意代码...

文 | 日报君 发自 凹非寺源 | 量子位又到周四&#xff0c;不少人心中的「小周末」&#xff01;你有没考虑下班后放松放松&#xff1f;劳逸结合&#xff0c;别忘关注这些「科技圈都在看」的新鲜事&#xff01;今日大新闻月薪3.6万算法工程师&#xff0c;日均写7行代码被开除&…