您的位置:首页 > 编程语言 > C#

C# 事件处理机制

2012-09-28 10:11 288 查看

C# 事件处理机制

事件简介:

   任何进行过图形用户界面开发的编程人员都会知道事件的概念。当用户在使用程序的时候,用户必然要和程序进行一定的交互。比如当用户点击窗体上的一个按钮后,程序就会产生该按钮被点击的事件,并通过相应的事件处理函数来响应用户的操作。这样用户的直观感觉就是程序执行了我要求的任务了。当然,事件并不一定是在和用户交互的情况下才会产生的,系统的内部也会产生一些事件并请求处理的,比如时钟事件就是一个很好例子。不过要介绍C#中的事件处理机制(扩展到更广的范围便是整个.Net框架),我们首先得明白一个叫"委托"的概念。

C#中的委托:

委托,顾名思义,就是中间代理人的意思。C#中的委托允许你将一个对象中的方法传递给另一个能调用该方法的类的某个对象。你可以将类A中的一个方法m(被包含在某个委托中了)传递给一个类B,这样类B就能调用类A中的方法m了。同时,你还可以以静态(static)的方式或是实例(instance)的方式来传递该方法。所以这个概念和C++中的以函数指针为参数形式调用其他类中的方法的概念是十分类似的。

委托的概念首先是在Visual J++中被提出来的,现在C#也应用了委托的概念,这也可谓是"拿来主义"吧。C#中的委托是通过继承System.Delegate中的一个类来实现的,下面是具体的步骤:

1. 声明一个委托对象,其参数形式一定要和你想要包含的方法的参数形式一致。public delegate void MyDelegate(参数);

2. 定义所有你要定义的方法,其参数形式和第一步中声明的委托对象的参数形式必须相同。 Method(参数);【参数要一致】

3. 创建委托对象并将所希望的方法包含在该委托对象中。 MyDelegate objMyDelegate = new MyDelegate(类.Method);

4. 通过委托对象调用包含在其中的各个方法。 objMyDelegate(待传入的参数);

以下的C#代码显示了如何运用以上的四个步骤来实现委托机制的:

using System;
//步骤1: 声明一个委托对象
public delegate void MyDelegate(string input);

//步骤2::定义各个方法,其参数形式和步骤1中声明的委托对象的必须相同
class MyClass1

//步骤3:创建一个委托对象并将上面的方法包含其中
class MyClass2

//步骤4:通过委托对象调用包含在其中的方法
class MyClass3
class Driver
public delegate void MyEventHandler(object sender, MyEventArgs e);

其中第一个参数(sender)指明了触发该事件的对象,第二个参数(e)包含了在事件处理函数中可以被运用的一些数据。上面的MyEventArgs类是从EventArgs类继承过来的,后者是一些更广泛运用的类,如MouseEventArgs类、ListChangedEventArgs类等的基类。对于基于GUI的事件,你可以运用这些更广泛的、已经被定义好了的类的对象来完成处理;而对于那些基于非GUI的事件,你必须要从EventArgs类派生出自己的类,并将所要包含的数据传递给委托对象。下面是一个简单的例子:

public class MyEventArgs:EventArgs
public event MyEventHandler MyEvent;

现在,我们来创建两个类,通过这两个类我们可以知道C#完成事件处理的机制是如何工作的。在我们的实例中,A类将提供事件的处理函数,并在步骤3中创建委托对象同时将事件处理函数包含在其中,同上所述,事件处理函数的参数形式必须和委托对象的参数形式相一致。然后,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

//步骤4:通过委托对象(也就是触发事件)来调用被包含的方法
class B
public class MyEventArgs:EventArgs
public class Driver
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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: