事件冒泡控件示例(转载)
2005-08-05 09:22
344 查看
.NET Framework 开发员指南 |
数据绑定控件(Repeater、DataList 和 DataGrid)使用事件冒泡将子控件(在项目模板内)引发的命令事件公开为顶级事件。虽然 .NET Framework 中的 ASP.NET 服务器控件将事件冒泡用于命令事件(事件数据类是从 [b]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 Boolean If 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 True End If Return 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 Boolean Dim handled As Boolean = False If TypeOf e Is TemplatedListCommandEventArgs Then Dim ce As TemplatedListCommandEventArgs = CType(e, TemplatedListCommandEventArgs) OnItemCommand(ce) handled = True End If Return handled End Function
有关说明事件冒泡的示例,请参见事件冒泡控件示例和模板化数据绑定控件示例。
注意[/b] 虽然启用事件冒泡的方法 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. [code]RaiseBubbleEvent(this, e);[/b]
}
[Visual Basic]
Protected Overridable Sub OnCommand(e As CommandEventArgs)
Dim handler As CommandEventHandler = CType(Events(EventCommand), CommandEventHandler)
If Not (handler Is Nothing) Then
handler(Me, e)
End If
' The Command event is bubbled up the control hierarchy.
RaiseBubbleEvent(Me, e)
End Sub[/code]
注意[/b] 事件冒泡并不限于命令事件。可以使用此处描述的机制使任何事件冒泡。
请参见
事件冒泡控件示例 | 模板化数据绑定控件示例事件冒泡控件示例
下面的自定义控件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 Strict
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace CustomControls
Public Class EventBubbler
Inherits Control
Implements INamingContainer
Private _number As Integer = 100
Private _label As Label
Private _box1 As TextBox
Private _box2 As TextBox
Public Event Click As EventHandler
Public Event Reset As EventHandler
Public Event Submit As EventHandler
Public Property Label() As String
Get
EnsureChildControls()
Return _label.Text
End Get
Set
EnsureChildControls()
_label.Text = value
End Set
End Property
Public Property Number() As Integer
Get
Return _number
End Get
Set
_number = value
End Set
End Property
Public Property Text1() As String
Get
EnsureChildControls()
Return _box1.Text
End Get
Set
EnsureChildControls()
_box1.Text = value
End Set
End Property
Public Property Text2() As String
Get
EnsureChildControls()
Return _box2.Text
End Get
Set
EnsureChildControls()
_box2.Text = value
End Set
End Property
Protected 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 Sub
Protected Overrides Function OnBubbleEvent(source As Object, e As EventArgs) As Boolean
Dim handled As Boolean = False
If TypeOf e Is CommandEventArgs Then
Dim ce As CommandEventArgs = CType(e, CommandEventArgs)
If ce.CommandName = "Click" Then
OnClick(ce)
handled = True
Else
If ce.CommandName = "Reset" Then
OnReset(ce)
handled = True
Else
If ce.CommandName = "Submit" Then
OnSubmit(ce)
handled = True
End If
End If
End If
End If
Return handled
End Function
Protected Overridable Sub OnClick(e As EventArgs)
RaiseEvent Click(Me, e)
End Sub
Protected Overridable Sub OnReset(e As EventArgs)
RaiseEvent Reset(Me, e)
End Sub
Protected Overridable Sub OnSubmit(e As EventArgs)
RaiseEvent Submit(Me, e)
End Sub
End Class
End Namespace
在页上使用事件冒泡控件
下面的 ASP.NET 页使用自定义事件冒泡控件EventBubbler,并将事件处理程序附加到其顶级事件。
[C#][/b]
<%@ 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:EventBubblerid = "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 Sub
Private Sub ResetHandler(sender As Object, e As EventArgs)
MyControl.Text1 = "0"
MyControl.Text2 = "0"
End Sub
Private Sub SubmitHandler(sender As Object, e As EventArgs)
If Int32.Parse(MyControl.Text1) + Int32.Parse(MyControl.Text2) = MyControl.Number Then
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."
End If
End Sub
</script>
<body>
<h1> The Mystery Sum Game </h1><br>
<form runat=server>
<Custom:EventBubblerid = "MyControl" OnClick = "ClickHandler"
OnReset = "ResetHandler" OnSubmit = "SubmitHandler" Number= "10" runat = server/>
</form>
</body>
</html>
相关文章推荐
- 背水一战 Windows 10 (69) - 控件(控件基类): UIElement - Manipulate 手势处理, 路由事件的注册, 路由事件的冒泡, 命中测试的可见性
- C++ Builder 实现动态生成窗口、控件,以及处理控件事件(转载)
- [转载 js] YUI解决mouseout事件冒泡的办法
- 简易密码输入自定义控件示例 含自定义事件 可在调用窗口事件视图中看到事件名
- js阻止冒泡及jquery阻止事件冒泡示例介绍
- JavaScript事件冒泡和阻止默认行为和阻止事件冒泡(转载)
- iOS不规则控件的点击事件(转载)
- js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
- js阻止默认事件与js阻止事件冒泡示例分享 js阻止冒泡事件
- Javascript学习日记-阻止javascript事件冒泡,获取控件ID值
- C#注册控件处理程序(SetConsoleCtrlHandler)函数示例 控制台关闭事件改写
- 第二章 .Net 控件开发(WebForm) 开发自定义复合控件(3) 事件冒泡
- 转载:Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载)
- js阻止冒泡及jquery阻止事件冒泡示例介绍
- js冒泡事件示例
- JavaScript示例六(事件冒泡与捕获)
- JavaScript示例六(事件冒泡与捕获)
- Js冒泡事件详解及阻止示例
- javascript事件冒泡简单示例
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡