引用:http://zhidao.baidu.com/question/23715790.html&__bd_tkn__=28b46e61363e812e5f00e362a3fe3cadc048dae28078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157a5ffa339860a0f840491fc7006f320ad23bbb7a4905ef750d2acb89a0453475725a435cbb150f333ab6adabe906eabbc9db8f02cc3621f74b
C#中的事件处理程序 C#中的事件处理程序是一个带有特定输入参数的代理,如下所示: public delegate void MyEventHandler(object sender, MyEventArgs e); 上面定义中的第一个参数(sender)指定了发生事件的对象,第二个参数(e)存储着在事件处理程序中要用到的数据。MyEventArgs类是继承EventArgs类得来的,EventArgs类是MouseEventArgs、ListChangedEventArgs等更专业化的类的基础类。对于GUI事件,我们可以使用这些特定的EventArgs类的对象,而无需自己创建特定的EventArgs类。然而,对于非GUI事件而言,我们仍然需要创建自己的特定的EventArgs类,存储希望向代理对象传递的数据。我们可以通过继承EventArgs类创建自己特定的EventArgs类: public class MyEventArgs EventArgs{ public string m_myEventArgumentdata; } 在事件处理程序中,代理对象的调用需要用到event关健字,如下所示: public event MyEventHandler MyEvent; 下面我们将建立二个类,体会.Net框架中事件处理机制的工作原理。在对代理的讨论的第二个步骤中,要求我们定义与定义的代理有完全相同的输入参数的方法。在我们的例子中,类A将提供事件处理程序(与代理对象具有相同输入参数的方法。),它将创建代理对象(对代理讨论中的第三步)并安装事件处理程序。类A然后会将代理对象传递给类B。当类B中有事件出现时,它就会执行类A中的事件处理程序方法。 using System; //步骤1:创建代理对象 public delegate void MyHandler1(object sender,MyEventArgs e); public delegate void MyHandler2(object sender,MyEventArgs e); //步骤2:创建事件处理程序方法 class A{ public const string m_id="Class A"; public void OnHandler1(object sender,MyEventArgs e){ Console.WriteLine("I am in OnHandler1 and MyEventArgs is {0}", e.m_id); } public void OnHandler2(object sender,MyEventArgs e){ Console.WriteLine("I am in OnHandler2 and MyEventArgs is {0}", e.m_id); } //步骤3:创建代理,安装事件处理程序,并向启动事件的对象注册。 public A(B b){ MyHandler1 d1=new MyHandler1(OnHandler1); MyHandler2 d2=new MyHandler2(OnHandler2); b.Event1 +=d1; b.Event2 +=d2; } } //步骤4:通过代理调用封装的方法。 class B{ public event MyHandler1 Event1; public event MyHandler2 Event2; public void FireEvent1(MyEventArgs e){ if(Event1 != null){ Event1(this,e); } } public void FireEvent2(MyEventArgs e){ if(Event2 != null){ Event2(this,e); } } } public class MyEventArgs EventArgs{ public string m_id; } public class Driver{ public static void Main(){ B b= new B(); A a= new A(b); MyEventArgs e1=new MyEventArgs(); MyEventArgs e2=new MyEventArgs(); e1.m_id ="Event args for event 1"; e2.m_id ="Event args for event 2"; b.FireEvent1(e1); b.FireEvent2(e2); } } C#中的GUI事件处理 Windows Forms(支持GUI应用程序的.NET框架)中的事件处理使用.NET事件处理模式。我们下面将应用这种模式编写一个简单的应用程序,该应用程序有一个继承自System.Windows.Forms.Form类的MyForm类。如果仔细地研究一下代码和其中的三行注释,就会发现其实我们无须定义代理和使用event关健字调用这些代理,因为我们已经可以使用GUI控制(表格、按钮等)的事件(鼠标点击等),代理就是System.EventHandler。当然了,我们仍然需要定义方法,创建代理对象(System.EventHandler),并在代理对象中安装方法,一旦有事件发生,方法就会开始执行。 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; public class MyForm Form{ private Button m_nameButton; private Button m_clearButton; private Label m_nameLabel; private Container m_components = null; public MyForm(){ initializeComponents(); } private void initializeComponents(){ m_nameLabel=new Label(); m_nameButton = new Button(); m_clearButton = new Button(); SuspendLayout(); m_nameLabel.Location=new Point(16,16); m_nameLabel.Text="Click NAME button, please"; m_nameLabel.Size=new Size(300,23); m_nameButton.Location=new Point(16,120); m_nameButton.Size=new Size(176, 23); m_nameButton.Text="NAME"; //创建代理,并安装方法,将代理捆绑在按钮的Click事件上 m_nameButton.Click += new System.EventHandler(NameButtonClicked); m_clearButton.Location=new Point(16,152); m_clearButton.Size=new Size(176,23); m_clearButton.Text="CLEAR"; //创建代理,并安装方法,将代理捆绑在按钮的Click事件上 m_clearButton.Click += new System.EventHandler(ClearButtonClicked); this.ClientSize = new Size(292, 271); this.Controls.AddRange(new Control[] {m_nameLabel,m_nameButton,m_clearButton}); this.ResumeLayout(false); } //定义输入参数与代理完全相同的方法 private void NameButtonClicked(object sender, EventArgs e){ m_nameLabel.Text="My name is john, please click CLEAR button to clear it"; } private void ClearButtonClicked(object sender,EventArgs e){ m_nameLabel.Text="Click NAME button, please"; } public static void Main(){ Application.Run(new MyForm()); } }