浅谈.net事件机制

  大家都有这样的经历:
  打开VS--〉新建应用程序(FORM1)--〉往里面挪按钮--〉双击按钮--〉写代码
  这看上去那么的自然,简单,可仔细想一下,窗口(FORM1)是一个类,按钮(Button)是另一个类,FORM1怎么知道按钮点击了?
  
  仔细看看代码,发现有如下代码:
1
2 this .button1.Click  +=   new  System.EventHandler( this .button1_Click);
3
4
5 private   void  button1_Click( object  sender, System.EventArgs e)
6          {
7        
8        }

  难道这就是传说中的事件委托?@_@
  button1的Click事件在Form1中注册了button1_Click这个方法,所以当button1点击的时候程序执行到了button1_Click下面。

  我对这个过程模拟了程序,

 1 using  System;
 2
 3 /// <summary>
 4/// 按钮类
 5/// </summary>

 6 class  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
44 class  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中的点击到底是怎么实现的。

你可能感兴趣的:(.net)