c# 事件处理

简介: 引用:http://zhidao.baidu.com/question/23715790.html&__bd_tkn__=28b46e61363e812e5f00e362a3fe3cadc048dae28078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f...

引用: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()); 
} 
}
相关文章
|
1月前
|
C#
c# Gridview 点击checkbox 触发的事件
c# Gridview 点击checkbox 触发的事件
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
3897 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
1月前
|
C#
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
C# Dev解决gridview1_SelectionChanged和gridview1_RowCellClick事件触发两次等问题
|
1月前
|
C#
C# 禁止ComboBox滚动事件细谈
C# 禁止ComboBox滚动事件细谈
|
5月前
|
Java C# C++
【从Java转C#】第八章:委托、lambda、事件
【从Java转C#】第八章:委托、lambda、事件
|
8月前
|
C# Windows
C#OOP之十一 委托和事件
C#OOP之十一 委托和事件
39 0
|
9月前
|
安全 C#
C#委托事件的区别
C#委托事件的区别
|
9月前
|
监控 安全 开发工具
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
Baumer工业相机堡盟工业相机如何通过BGAPI SDK使用DeviceEvents“设备事件”记录相机事件的各类时间(C#)
66 0
|
10月前
|
移动开发 JSON API
C#-钉钉开发H5应用-事件订阅
C#-钉钉开发H5应用-事件订阅
221 0
|
10月前
|
JSON API 数据安全/隐私保护
C#-钉钉事件订阅-接口回调
C#-钉钉事件订阅-接口回调
233 0