浅谈.net事件机制
2010-02-20 11:01
393 查看
大家都有这样的经历:
打开VS--〉新建应用程序(FORM1)--〉往里面挪按钮--〉双击按钮--〉写代码
这看上去那么的自然,简单,可仔细想一下,窗口(FORM1)是一个类,按钮(Button)是另一个类,FORM1怎么知道按钮点击了?
仔细看看代码,发现有如下代码:
1
2this.button1.Click += new System.EventHandler(this.button1_Click);
3
4
5private void button1_Click(object sender, System.EventArgs e)
6 {
7
8 }
难道这就是传说中的事件委托?@_@
button1的Click事件在Form1中注册了button1_Click这个方法,所以当button1点击的时候程序执行到了button1_Click下面。
我对这个过程模拟了程序,
1using System;
2
3/**//// <summary>
4/// 按钮类
5/// </summary>
6class Button
7{
8 /**//// <summary>
9 /// 传送给点击事件接收者的一些信息
10 /// </summary>
11 public class ButtonEventArgs:EventArgs
12 {
13 public string buttonId;
14 public ButtonEventArgs(string buttonId)
15 {
16 this.buttonId = buttonId;
17 }
18 }
19
20 //定义的委托
21 public delegate void ButtonEventHandler(object sender,ButtonEventArgs args);
22
23 //事件成员
24 public event ButtonEventHandler Click;
25
26 //假设用户点击按钮可以直接进入这个方法,
27 public void UserClick(string buttonId)
28 {
29 ButtonEventArgs e = new ButtonEventArgs(buttonId);
30 Console.WriteLine("我是按钮({0})",e.buttonId);
31 OnClick(e);
32 }
33
34 //该方法通知到事件登记对象(Click就想个变量,它指向了事件登记对象的回调方法,既Page里的On_Click)
35 protected virtual void OnClick(ButtonEventArgs e)
36 {
37 if(Click != null)
38 {
39 Click(this,e);
40 }
41 }
42}
43
44class Form1
45{
46 //登记Button的Click事件
47 public Form1(Button btn)
48 {
49 btn.Click += new Button.ButtonEventHandler(On_Click);
50 }
51
52 //这个方法可以撤销Button的Click事件
53 public void Unregister(Button btn)
54 {
55 Button.ButtonEventHandler callback = new Button.ButtonEventHandler(On_Click);
56 btn.Click -= callback;
57 }
58
59 public void On_Click(object sender,Button.ButtonEventArgs e)
60 {
61 Console.WriteLine("\n按钮:{0}已经被点击,将发生些事情.",e.buttonId);
62 }
63
64 /**//// <summary>
65 /// 程序入点
66 /// </summary>
67 public static void Main()
68 {
69 Button btn = new Button();
70 Form1 frm = new Form1(btn);
71 btn.UserClick("btnNo4");
72 }
73}
运行结果:
我是按钮(btnNo4)
按钮:btnNo4已经被点击,将发生些事情....
可以看出在Form1的构造中登记了Button的Click事件并将邦定到了Form1的On_Click方法中,Form1就可以不用关,Button中的点击到底是怎么实现的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jbgh608/archive/2007/09/01/1767963.aspx
打开VS--〉新建应用程序(FORM1)--〉往里面挪按钮--〉双击按钮--〉写代码
这看上去那么的自然,简单,可仔细想一下,窗口(FORM1)是一个类,按钮(Button)是另一个类,FORM1怎么知道按钮点击了?
仔细看看代码,发现有如下代码:
1
2this.button1.Click += new System.EventHandler(this.button1_Click);
3
4
5private void button1_Click(object sender, System.EventArgs e)
6 {
7
8 }
难道这就是传说中的事件委托?@_@
button1的Click事件在Form1中注册了button1_Click这个方法,所以当button1点击的时候程序执行到了button1_Click下面。
我对这个过程模拟了程序,
1using System;
2
3/**//// <summary>
4/// 按钮类
5/// </summary>
6class Button
7{
8 /**//// <summary>
9 /// 传送给点击事件接收者的一些信息
10 /// </summary>
11 public class ButtonEventArgs:EventArgs
12 {
13 public string buttonId;
14 public ButtonEventArgs(string buttonId)
15 {
16 this.buttonId = buttonId;
17 }
18 }
19
20 //定义的委托
21 public delegate void ButtonEventHandler(object sender,ButtonEventArgs args);
22
23 //事件成员
24 public event ButtonEventHandler Click;
25
26 //假设用户点击按钮可以直接进入这个方法,
27 public void UserClick(string buttonId)
28 {
29 ButtonEventArgs e = new ButtonEventArgs(buttonId);
30 Console.WriteLine("我是按钮({0})",e.buttonId);
31 OnClick(e);
32 }
33
34 //该方法通知到事件登记对象(Click就想个变量,它指向了事件登记对象的回调方法,既Page里的On_Click)
35 protected virtual void OnClick(ButtonEventArgs e)
36 {
37 if(Click != null)
38 {
39 Click(this,e);
40 }
41 }
42}
43
44class Form1
45{
46 //登记Button的Click事件
47 public Form1(Button btn)
48 {
49 btn.Click += new Button.ButtonEventHandler(On_Click);
50 }
51
52 //这个方法可以撤销Button的Click事件
53 public void Unregister(Button btn)
54 {
55 Button.ButtonEventHandler callback = new Button.ButtonEventHandler(On_Click);
56 btn.Click -= callback;
57 }
58
59 public void On_Click(object sender,Button.ButtonEventArgs e)
60 {
61 Console.WriteLine("\n按钮:{0}已经被点击,将发生些事情.",e.buttonId);
62 }
63
64 /**//// <summary>
65 /// 程序入点
66 /// </summary>
67 public static void Main()
68 {
69 Button btn = new Button();
70 Form1 frm = new Form1(btn);
71 btn.UserClick("btnNo4");
72 }
73}
运行结果:
我是按钮(btnNo4)
按钮:btnNo4已经被点击,将发生些事情....
可以看出在Form1的构造中登记了Button的Click事件并将邦定到了Form1的On_Click方法中,Form1就可以不用关,Button中的点击到底是怎么实现的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jbgh608/archive/2007/09/01/1767963.aspx
相关文章推荐
- 浅谈Java与C#的事件处理机制
- 自己动手用委托模拟.net中的事件机制
- 浅谈android事件分发机制
- Henry手记—使用Template Method设计模式的.NET事件处理机制(一)
- 浅谈DOM中事件机制
- 深入理解.net的事件与委托机制
- dotNet学习笔记-浅谈.Net的事件代理
- android事件传递机制的浅谈
- 深入理解.net的事件与委托机制
- [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
- .Net委托机制之事件委托
- .Net 2.0 事件机制,更简化了...
- 浅谈Android之Activity触摸事件传输机制介绍
- .NET事件机制之多播委托
- 浅谈node的事件机制
- 自己动手用委托模拟.net中的事件机制
- 菜鸟学习Cocos2d-x 3.x——浅谈事件处理机制
- .Net 机制下委托(一) 事件委托
- 理解.net中的事件机制
- 浅谈Android 的事件分发机制