zoukankan      html  css  js  c++  java
  • [转载] C# 自定义事件和委托

    C# 自定义事件和委托

    原文地址:http://blog.sina.com.cn/s/blog_5cdc2a610100e5fz.html

    在windows 编程中用到最多的就是控件的事件了,微软给我们很好的方式,把注意力放到事件执行方法的设计和编码上,但是我们真正弄懂了事件的真正出发执行原理的话,对我们的编程的提高真是非常棒的,例如在windows编程中如果我单击了一个button按钮触发了button 的click事件 Button1_Click(){} ,但是有时候我们编程的时候,不但想要触发button 的单击事件,我还想要把其他的事件也要调用下来顺序执行,要实现这种方式,除了在方法最后对其他方法的调用,还可以利用将其他需要顺序执行的方法封装到button的click 事件的委托对象中,这样就能够顺序执行毁掉方法列表中的程序了,而这种方式的实现是以清楚事件触发和委托的调用为前提的。

    事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,调用我们所准备好的处理方法,而是先消息的响应的。要响应某些事件并针对某些事件执行我们意定的方法,需要做到以下几步:

    1、声明事件委托。

    2、声明事件。

    3、添加事件的触发方法。

    4、添加事件的处理程序(响应事件的方法)。

    5、将指定的事件处理程序邦定到要处理的事件上(订阅事件)。

    6、用户信息操作,并触发事件(调用事件的触发方法)。

    7、通过事件委托的回调,执行我们需要的事件处理程序。

    下面我们举一个简单的自定义事件处理程序的例子(控制台程序)

    View Code
    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键 a 发送者:事件.TestEventSource,所按得健为:a

    取消订阅事件

    输入一个字符,再按enter键

    TestEventSource类。他就相当于windows控件类一样,是事件的源,里面包含有事件的声明,以及存储调用参数的事件参数类,以及事件的触发方法。

    TestEventListener类。他提供了事件处理程序,并实现了事件处理程序和事件对象的邦定,当然时间处理程序可以放在别处,跟邦定程序(订阅事件)放在一起便于理解和调用Test 类,实例化自定义事件的事件源对象,并调用 TestEventListener类中的Subscribe(es);方法进行事件对象和事件处理程序的邦定(订阅事件),调用 TestEventSource类中的RaiseEvent(char keyToRaiseEvent)引发对象,并有对象所指定的委托回调处理事件。完成整个自定义事件。

    其中 RaiseEvent(char keyToRaiseEvent) 就相当于main()一样是自定义事件的执行入口, 从这个法开始---〉调用事件委托----〉查找订阅事件程序找到事件所封装的方法集----〉由委托回调事件处理程序并传递参数---〉执行事件处理程序。

  • 相关阅读:
    javascript变量作用域、匿名函数及闭包
    SenchaTouch2中navigation下嵌入list无事件响应问题解决
    Fedora17安装SSH
    25个必须记住的SSH命令
    linux下安装hadoop
    Fedora17实现图形界面root登录
    virtualBox利用已创建的vdi文件克隆快速创建新虚拟机
    printf/scanf格式修饰符
    windowsServer2003服务器上修改ftp端口号
    为ckeditor添加行距的功能(转载)
  • 原文地址:https://www.cnblogs.com/gzhu/p/2275314.html
Copyright © 2011-2022 走看看