事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,调用我们所准备好的处理方法,而是先消息的响应的。要响应某些事件并针对某些事件执行我们意定的方法,需要做到以下几步:
1、声明事件委托。
2、声明事件。
3、添加事件的触发方法。
4、添加事件的处理程序(响应事件的方法)。
5、将指定的事件处理程序邦定到要处理的事件上(订阅事件)。
6、用户信息操作,并触发事件(调用事件的触发方法)。
7、通过事件委托的回调,执行我们需要的事件处理程序。
下面我们举一个简单的自定义事件处理程序的例子(控制台程序)
namespace 事件 { //发布事件的类 public class TestEventSource { //定义事件参数类 public class TestEventArgs : EventArgs { public readonly char KeyToRaiseEvent; public TestEventArgs(char keyToRaiseEvent) { KeyToRaiseEvent = keyToRaiseEvent; } }
//定义delegate public delegate void TestEventHandler(object sender, TestEventArgs e); //用event 关键字声明事件对象 public event TestEventHandler TestEvent;
//事件触发方法 protected virtual void OnTestEvent(TestEventArgs e) { if (TestEvent != null) TestEvent(this, e); }
//引发事件 public void RaiseEvent(char keyToRaiseEvent) { TestEventArgs e = new TestEventArgs(keyToRaiseEvent); OnTestEvent(e); }
} //监听事件的类 public class TestEventListener { //定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型 public void KeyPressed(object sender, TestEventSource.TestEventArgs e) { Console.WriteLine("发送者:{0},所按得健为:{1}", sender, e.KeyToRaiseEvent); }
//订阅事件 public void Subscribe(TestEventSource evenSource) { evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed); } //取消订阅事件 public void UnSubscribe(TestEventSource evenSource) { evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed); } }
//测试类 public class Test { public static void Main() { //创建事件源对象 TestEventSource es = new TestEventSource(); //创建监听对象 TestEventListener el = new TestEventListener(); //订阅事件 Console.WriteLine("订阅事件\n"); el.Subscribe(es); //引发事件 Console.WriteLine("输入一个字符,再按enter键"); string s = Console.ReadLine(); es.RaiseEvent(s.ToCharArray()[0]); //取消订阅事件 Console.WriteLine("\n取消订阅事件\n"); el.UnSubscribe(es);
//引发事件 Console.WriteLine("输入一个字符,再按enter健"); s = Console.ReadLine(); es.RaiseEvent(s.ToCharArray()[0]);
} }
}
程序执行结
订阅事件
输入一个字符,再按enter键aaaa发送者:事件.TestEventSource,所按得健为:a
取消订阅事件
输入一个字符,再按enter健
TestEventSource类。他就相当于windows控件类一样,是事件的源,里面包含有事件的声明,以及存储调用参数的事件参数类,以及事件的触发方法。
TestEventListener类。他提供了事件处理程序,并实现了事件处理程序和事件对象的邦定,当然时间处理程序可以放在别处, 跟邦定程序(订阅事件)放在一起便于理解和调用
Test 类,实例化自定义事件的事件源对象,并调用 TestEventListener类中的Subscribe(es);方法进行事件对象和事件处理程序的邦定(订阅事件),调用 TestEventSource类中的RaiseEvent(char keyToRaiseEvent)引发对象,并有对象所指定的委托回调处理事件。完成整个自定义事件。
其中 RaiseEvent(char keyToRaiseEvent) 就相当于main()一样是自定义事件的执行入口, 从这个法开始---〉调用事件委托----〉查找订阅事件程序找到事件所封装的方法集----〉由委托回调事件处理程序并传递参数---〉执行事件处理程序。
摘录自:http://www.cnblogs.com/huomm/archive/2007/12/04/982869.html
浅析C#的事件处理和自定义事件 http://dev.csdn.net/develop/article/22/22951.shtm
http://www.cnblogs.com/BeginnerClassroom/archive/2009/01/11/1373689.html
转载于:https://www.cnblogs.com/wuhenke/archive/2009/12/13/1623227.html
相关资源:数据结构—成绩单生成器