zoukankan      html  css  js  c++  java
  • 事件

    摘自 http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html

    实际项目中也写的有事件,但是不是特别理解,还是先放代码:

        internal class KeyEventArgs : EventArgs
        {
            private char keyChar;
            public KeyEventArgs(char keyChar)
            {
                this.keyChar = keyChar;
            }
    
            public char KeyChar
            {
                get
                {
                    return keyChar;
                }
            }
        }
        internal class KeyInputMonitor
        {
            // 创建一个委托,返回类型为void,两个参数
            public delegate void KeyDownHandler(object sender, KeyEventArgs e);
            // 将创建的委托和特定事件关联,在这里特定的事件为KeyDown
            public event KeyDownHandler KeyDown;
    
            public void Run()
            {
                bool finished = false;
                do
                {
                    Console.WriteLine("Input a char");
                    string response = Console.ReadLine();
    
                    char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
                    switch (responseChar)
                    {
                        case 'X':
                            finished = true;
                            break;
                        default:
                            // 得到按键信息的参数
                            KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
                            // 触发事件
                            KeyDown(this, keyEventArgs);
                            break;
                    }
                } while (!finished);
            }
        }
        internal class EventReceiver
        {
            public EventReceiver( KeyInputMonitor monitor )
            {
                // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
                monitor.KeyDown += new KeyInputMonitor.KeyDownHandler( this.OnKeyDown );
            }
            private void OnKeyDown(object sender, KeyEventArgs e)
            {
                // 真正的事件处理函数
                Console.WriteLine( "Capture key: {0}", e.KeyChar );
            }
        }
        
        
        class Program
        {
            static void Main(string[] args)
            {
                // 实例化一个事件发送器
                KeyInputMonitor monitor = new KeyInputMonitor();
                // 实例化一个事件接收器
                EventReceiver eventReceiver = new EventReceiver(monitor);
                // 运行
                monitor.Run();
            }
        }

    C#中使用事件需要的步骤:
    1.创建一个委托
    2.将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)
    3.编写事件处理程序
    4.利用编写的事件处理程序生成一个委托实例
    5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件

    C#中事件产生和实现的流程:
    1.定义A为产生事件的实例,a为A产生的一个事件
    2.定义B为接收事件的实例,b为处理事件的方法
    3.A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
    4.A通过事件列表中的委托对象将这个事件通知给B
    5.B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
    6.调用B.b方法完成事件处理
        public class A
        {
            public delegate void EventHandler(object sender);
            public event EventHandler a;

            public void Run()
            {
                Console.WriteLine("Trigger an event.");
                a(this);
            }
        }

        class B
        {
            public B(A a)
            {
                a.a += new A.EventHandler(this.b);
            }
            private void b(object sender)
            {
                Console.WriteLine("Received and handled an event." );
                Console.Read();
            }
        }

  • 相关阅读:
    Entity Framework:第三方开发MySQL,Oracle,SQLite ADO.NET Provider支持Entity Framework
    添加WCF服务引用失败解决办法
    [笔记]iBatisNET配置问题
    [转]Silverlight 使用Isolate Storage进行客户端数据缓存
    [转]Oralce之时间转换用法 TO_CHAR(DATE,FORMAT)
    在ASP.NET3.5下利用Linq,Ajax创建一个线上网络聊天室
    解决水晶报表发布后报错:不支持的操作。无法在 C++ 堆栈中打开由 JRC 引擎处理的文档。
    Windows Live Writer
    [转]VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
    SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志
  • 原文地址:https://www.cnblogs.com/nygfcn1234/p/3316500.html
Copyright © 2011-2022 走看看