C# 自定义事件


在事件处理方法中,类似下面这种形式

private void Button_Click(object sender, EventArgs e)

总是有2个参数,object类型的,EventArgs或者继承于EventArgs的参数,他们的代表的意思分表是:

object sender 发出事件的对象

System.EventArgs e 对象中的数据

以Button为例:

protected void Button1_Click(object sender, EventArgs e)

其中的sender,就是你点击的button.可以通过类型转换得到这个button的引用:

Button sendButton = (Button)sender;

e是你点击事件的一些参数。在某些事件里,e用处不大,比如在MouseEventArgs的Mouse事件中,可以看到e包括mouse的坐标值等,以供你的程序使用。

自定义事件:

在MSDN中是这么描述的:

类或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”

事件具有以下特点:

  • 发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
  • 一个事件可以有多个订户。 一个订户可处理来自多个发行者的多个事件。
  • 没有订户的事件永远也不会引发。
  • 事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。
  • 如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。 要异步调用事件,请参见使用异步方式调用同步方法
  • 在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。

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

  • 声明委托、事件
  • 添加事件的触发方法,也就是通知接受者方法
  • 添加事件引发方法
  • 接受者处本地化响应方法
  • 接受者订阅事件

在vs2003中触发一个Button事件一般是这么写

this.btnAdd.Click += new System.EventHandler(this. btnAdd _Click);

示例代码:

using System;

namespace ConsoleApplication1
{
    //定义delegate
   public delegate void myEventHandler(object sender, myEventArgs e);
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入一个名字,按enter");
           string s=Console.ReadLine();

           KeyPressEvent source = new KeyPressEvent();
           KeyPressListener listener = new KeyPressListener(source);//初始化时订阅事件
            myEventArgs argument=new myEventArgs();
            argument.name=s;
            source.DidInput(argument);

            //取消订阅
            Console.WriteLine("取消监听事件(订阅),按enter");
            Console.ReadLine();
            listener.detach();//取消监听(订阅)
            Console.WriteLine("已经取消了监听事件");

            Console.WriteLine("请再次输入一个名字,按enter");
            string s2 = Console.ReadLine();
            myEventArgs argument2 = new myEventArgs();
            argument2.name = s2;
            source.DidInput(argument2);

            Console.ReadLine();
        }
    }
    //定义事件参数类
    public class myEventArgs : EventArgs
    {
       public string myArgument { 
           get{ return "我是参数";}
       }
       public string name { get; set; }    
    }

    //事件发行者
    class KeyPressEvent {
        public event myEventHandler OnKeyPress;// 用event 关键字声明事件对象

        //修饰符 virtual则是保证在控制访问修饰符的前提下保证可继承并支持重写事件触发方法
        public virtual void DidInput(myEventArgs e)//事件触发的方法
        {
            if (OnKeyPress != null)
            {
                OnKeyPress(this, e);
            }
        }
    }
    //监听者(订阅者)
    class KeyPressListener {
        private KeyPressEvent keyPressEvent;

        // 构造方法,订阅事件
        public KeyPressListener(KeyPressEvent evenSource)
        {
            keyPressEvent = evenSource;
            //keyPressEvent.OnKeyPress+=keyPressEvent_OnKeyPress;
            keyPressEvent.OnKeyPress += new myEventHandler(keyPressEvent_OnKeyPress);
        }

        private void keyPressEvent_OnKeyPress(object sender, myEventArgs e)
        {            
            Console.WriteLine(string.Format("触发了。。{0}--{1} and name={2}",sender,e.myArgument,e.name));
        }
        //取消订阅事件
        public void detach()
        {
            keyPressEvent.OnKeyPress -= keyPressEvent_OnKeyPress;
        }
    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM