源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#中自定义事件和委托实例

  • 时间:2022-11-07 06:40 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#中自定义事件和委托实例
在windows 编程中用到最多的就是控件的事件了,微软给我们很好的方式,把注意力放到事件执行方法的设计和编码上,但是但我们真正弄懂了事件的真正出发执行原理的话,对我们的编程的提高真是非常榜的,例如在windows编程中 如果我单击了一个button按钮触发了button 的click事件  Button1_Click(){} ,但是有时候我们编程的时候,不但想要触发button 的单击事件,我还想要把其他的时间也要调用下来顺序执行,要实现这种方式,除了在方法最后对其他方法的调用,还可以利用将其他需要顺序执行的方法封装到button的click 事件的委托对象中,这样就能够顺序执行毁掉方法列表中的程序了,而这种方式的实现是以清楚事件触发和委托的调用为前提的。 事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,调用我们所准备好的处理方法,而是先消息的响应的。要响应某些事件并针对某些事件执行我们意定的方法,需要做到以下几步: 1、声明事件委托。 2、声明事件。 3、添加事件的触发方法。 4、添加事件的处理程序(响应事件的方法)。 5、将指定的事件处理程序邦定到要处理的事件上(订阅事件)。 6、用户信息操作,并触发事件(调用事件的触发方法)。 7、通过事件委托的回调,执行我们需要的事件处理程序。 下面我们举一个简单的自定义事件处理程序的例子(控制台程序)
[u]复制代码[/u] 代码如下:
   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]);           }     } }
程序执行结果
[u]复制代码[/u] 代码如下:
订阅事件 输入一个字符,再按enter键 aaaa 发送者:事件.TestEventSource,所按得健为:a 取消订阅事件 输入一个字符,再按enter健
TestEventSource类。他就相当于windows控件类一样,是事件的源,里面包含有事件的声明,以及存储调用参数的事件参数类,以及事件的触发方法。       TestEventListener类。他提供了事件处理程序,并实现了事件处理程序和事件对象的邦定,当然时间处理程序可以放在别处, 跟邦定程序(订阅事件)放在一起便于理解和调用 Test 类,实例化自定义事件的事件源对象,并调用 TestEventListener类中的Subscribe(es);方法进行事件对象和事件处理程序的邦定(订阅事件),调用 TestEventSource类中的RaiseEvent(char keyToRaiseEvent)引发对象,并有对象所指定的委托回调处理事件。完成整个自定义事件。 其中   RaiseEvent(char keyToRaiseEvent)      就相当于main()一样是自定义事件的执行入口,       从这个法开始---〉调用事件委托----〉查找订阅事件程序找到事件所封装的方法集----〉由委托回调事件处理程序并传递参数---〉执行事件处理程序。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部