触发事件,检查是否注册过事件的方法

下面的代码,会发现事件没有被注册

 class Program
    {
        static void Main(string[] args)
        {
            EventCheck check = new EventCheck();
            check.OnDataArrived(new DataArrivedEventArgs() { data="Hello World!"});
            Console.ReadKey();
        }

        static void check_DataArrived(object sender, DataArrivedEventArgs e)
        {
            Console.WriteLine(e.data);
        }
    }

    class EventCheck
    {
        //第三步 use the delegate type to declare a variable that can refer to any method with the same signature as the delegate.
        //To associate the event with the method that will handle the event, add an instance of the delegate to the event.
        //The event handler is called whenever the event occurs, unless you remove the delegate.
        internal event DataArrivedEventHandler DataArrived;

        //第四步
        internal void OnDataArrived(DataArrivedEventArgs e)
        {
            try
            {
                //DataArrivedEventHandler handler = DataArrived;
                //if (handler != null)
                //{
                //    handler(this, e);
                //}
                DataArrived += EventCheck_DataArrived;
                if (DataArrived != null)
                {
                    DataArrived -= EventCheck_DataArrived;
                    DataArrived(this, e);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("遇到异常{0}", ex.Message);
            }
        }

        void EventCheck_DataArrived(object sender, DataArrivedEventArgs e)
        {
            Console.WriteLine(e.data);
        }
    }

    //第二步   Represents the method that will handle an event when the event provides data.
    //This method‘s first parameter is of type Object and refers to the instance that raises the event.
    //Its second parameter is derived from type EventArgs and holds the event data.
    //If the event does not generate event data, the second parameter is simply the value of the EventArgs.Empty field.
    //Otherwise, the second parameter is a type derived from EventArgs and supplies any fields or properties needed to hold the event data.
    delegate void DataArrivedEventHandler(object sender,DataArrivedEventArgs e);  //正式写代码的时候,可以使用EventHandler<TEventArgs>泛型委托

    //第一步
    //create a custom event data class, create a class that derives from the EventArgs class and provide the properties to store the necessary data.
    //The name of your custom event data class should end with EventArgs.
    class DataArrivedEventArgs : EventArgs
    {
       internal string data;
    }

修改第四步的代码,先将事件复制到临时变量里面,然后通过这个临时变量来处理,就不会有问题

//第四步
        internal void OnDataArrived(DataArrivedEventArgs e)
        {
            try
            {
                //DataArrivedEventHandler handler = DataArrived;
                //if (handler != null)
                //{
                //    handler(this, e);
                //}
                DataArrived += EventCheck_DataArrived;
                DataArrivedEventHandler handler = DataArrived;
                if (handler != null)
                {
                    DataArrived -= EventCheck_DataArrived;
                    handler(this, e);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("遇到异常{0}", ex.Message);
            }
        }
时间: 2024-08-06 03:45:47

触发事件,检查是否注册过事件的方法的相关文章

js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象

事件对象    在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对象中,会包含鼠标位置的信息,而键盘操作导致的事件对象中,会包含与按下的键有关的信息.所有浏览器对象都支持event对象,但支持方式不同. DOM中的事件对象 兼容DOM的浏览器会将一个event对象传入到事件处理程序中.无论指定事件处理程序时使用什么方法(DOM0级或DOM2级),都会传入event

Event Handler 事件处理程序 2 ---跨浏览器事件对象《高程3》

0 Event Object导论 支持DOM0.DOM2的浏览器和IE浏览器实现事件处理程序的不同,除了体现在添加事件处理程序的不同上,还体现在event对象的实现差异上,包括具体的属性和方法.在触发DOM上的某个事件时,都会产生一个event对象,这个对象包含着所有与事件有关的信息.一旦事件处理程序执行完成,event对象就会被销毁.所有浏览器对event的支持方式包括:DOM事件对象和IE事件对象. 1.1 DOM0和DOM2支持的Event对象(针对IE之外的浏览器) 兼容 DOM 的浏览

菜鸟学JS(四)——javascript为按钮注册回车事件(设置默认按钮)

不得不说,在JS方面,自己真的是个不折不扣的菜鸟.对于JS以及一些JS框架如JQuery等JS框架,自己也只是处在简单应用的阶段,当然自己也在不断的学习当中,希望将来能跟大家分享更多JS方面的心得.今天先来点开胃的,说一下如何设置一个默认按钮,就是不管焦点在不在按钮上,只要按下回车,就等于触发了按钮的单击事件. 代码非常简单,要完成这个功能,只需几行代码: //为keyListener方法注册按键事件 document.onkeydown=keyListener; function keyLis

关于在Cocos2dx中注册触摸事件——Lua

关于在Cocos2dx中注册触摸事件,之前一直对此一知半解,这两天在看引擎的源码,趁此机会写下来... 以下纯属个人理解,如有不对欢迎指正... 在引擎的CCLayer类中声明了有四个方法: 1 virtual bool onTouchBegan(Touch *touch, Event *unused_event); 2 virtual void onTouchMoved(Touch *touch, Event *unused_event); 3 virtual void onTouchEnde

事件注册 DOM事件流 事件对象(常用属性,方法) 事件委派(鼠标,键盘事件对象)

注册事件概述 给元素添加事件,称为注册事件或者绑定事件 注册事件有两种方式:传统方式和方法监听注册方式 传统注册方式:利用 on 开头的事件:例如:onclick:注册事件的唯一性,后面的注册事件会把前面的覆盖 方法监听注册方式:addEventListener()IE9+:IE9以前用 attacthEvent()代替:会按照注册顺序依次执行没有唯一性的问题 addEventListener() 事件监听方式 eventTarget.addEventListener(type, listene

jquery为链接a元素注册click事件并避免跳转现象

jquery为链接a元素注册click事件并避免跳转现象:在实际应用中,可能需要将链接a作为一个普通的按钮使用,但是由于点击按钮会导致跳转动作,下面就通过代码实例介绍一下如何实现点击功能,并且不会出现跳转现象,代码如下: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.

JQuery触发radio或checkbox的change事件

在JQuery中,当给radio或checkbox添加一个change事件时,如果它的值发生变化就会触发change事件;本文将详细介绍如何利用JQuery触发Checkbox的change事件需要了解的朋友可以参考下 早上要做一功能,checkbox被选中时,显示隐藏的层,取消选中时,再隐藏选中的层. 初始代码如下: 复制代码代码如下: $(function(){ $("#ischange").change(function() { alert("checked"

jquery 事件 多次绑定,多次触发,怎么清除历史绑定事件

Jquery在处理事件的时候有时候会遇到预想不到的结果 如下 <a id="link_foo">Foo</a> <script type="text/javascript">     function bindFooClick(){       $("#link_foo").click(function(){         console.log("www.vincentguo.cn");

解决jquery中动态新增的元素节点无法触发事件的问题有两种解决方法

解决jquery中动态新增的元素节点无法触发事件的问题有两种解决方法,如下: 为了达到更好的演示效果,假设在某个页面的body下有以下结构的代码: ? 1 2 3 4 5 6 7 8 9 10 11 <p id="pLabel">新加一条</p> <ul id="ulLabel">  <li class="liLabel">aaa1</li>  <li class="li