如何判断某个事件已经绑定了某个事件处理程序?

btn.Click += new EventHandler(button2_Click);
//获取Button类定义的所有事件的信息PropertyInfo pi = (typeof(Button)).GetProperty("Events", BindingFlags.Instance |BindingFlags.NonPublic);
//获取Button对象btn的事件处理程序列表EventHandlerList ehl = (EventHandlerList)pi.GetValue(btn,null);//获取Control类Click事件的字段信息FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static |BindingFlags.NonPublic);
//用获取的Click事件的字段信息,去匹配btn对象的事件处理程序列表,获取btn对象Click事件的委托对象
//事件使用委托定义的,C#中的委托时多播委托,可以绑定多个事件处理程序,当事件发生时,这些事件处理程序被依次执行
//是否已经绑定了事件
private bool IsBindEvent(Type type, Control con, string eventName)
{
    bool isBind = false;

    PropertyInfo pi = type.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);   //获取type类定义的所有事件的信息
    EventHandlerList ehl = (EventHandlerList)pi.GetValue(con, null);    //获取con对象的事件处理程序列表
    FieldInfo fieldInfo = (typeof(Control)).GetField("EventText", BindingFlags.Static | BindingFlags.NonPublic); //获取Control类Click事件的字段信息
    Delegate d = ehl[fieldInfo.GetValue(null)];
    if (d == null)
    {
        return isBind;
    }
    foreach (Delegate del in d.GetInvocationList())
    {
        if (del.Method.Name == eventName)
        {
            isBind = true;
            break;
        }
    }
    return isBind;
}
使用示例

var isBind = IsBindEvent(comboBox.GetType(), comboBox, "comboBox_TextChanged");

if (!isBind)

{

comboBox.TextChanged += comboBox_TextChanged;

}
时间: 2024-10-19 18:18:47

如何判断某个事件已经绑定了某个事件处理程序?的相关文章

对事件委托绑定click的事件的解绑

大家都知道解绑事件的jquery写法,很简单: $("xxx").unbind("click"); 然后对于事件委托式的事件绑定,亲测,这种解绑方法是无效的, $(".sideNav>ul").on("click", function (e) {     alert("aaa"+$(e.tagert).index()); } 即使做判断让一部分带有某个class的li标签的ul解绑click,依然无效

关于js中对事件绑定与普通事件的理解

普通事件指的是可以用来注册的事件: 事件绑定是指把事件注册到具体的元素之上. 通俗点说: 普通事件:给html元素添加一个特定的属性(如:onclick): 事件绑定:js代码中通过标记(id  tag class)获取元素,给元素添加特定的方法(如:onclick): 扩展:事件监听addEventListener事件可以绑定多次事件,并进行触发 div1.onclick = function(){}; <button onmouseover = " "></but

事件的绑定与this and 闭包的实用

事件的绑定: 事件作为元素的属性 <button onclick=""></button> 事件作为元素对象的属性 element.event = function(){ } element.event = funName; this 实用: 循环绑定事件,获取绑定事件的对象时,需要使用this 元素内部绑定事件时,传入this,代表该元素对象自己 标签代表元素 通过byid TagName  ... 获取元素标签对象 闭包: 循环绑定事件,将循环变量保留下来时

深入理解DOM事件机制系列第二篇——事件处理程序

× 目录 [1]HTML [2]DOM0级 [3]DOM2级[4]IE[5]总结 前面的话 事件处理程序又叫事件侦听器,实际上就是事件的绑定函数.事件发生时会执行函数中相应代码.事件处理程序有HTML事件处理程序.DOM0级事件处理程序.DOM2级事件处理程序和IE事件处理程序四类,下面将详细介绍该部分内容 HTML事件处理程序 某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定.这个特性的值应该是能够执行的JavaScript代码 在事件处理程序函数内部,this

jQuery 判断元素上是否绑定了事件

我研究了一下之后发现,jQuery都将事件缓存起来了,其实也是为了防止内存溢出以及页面unload的时候的速度,也包括多函数触发,方便管理等诸多好处,具体可以参考此文. jQuery会在window.unload的时候卸载所有绑定过的事件,释放内存的. OK,言归正传.判断元素上是否绑定过事件用如下语句 jQuery.data(elem,"events")[type] //老版本也能用 $(elem).data("events")[type] //1.2.3以后才能

jQuery学习-事件之绑定事件(七)

今天来说说事件中的handlers方法中的一个片段 1 matches[ sel ] = handleObj.needsContext ?  2     jQuery( sel, this ).index( cur ) >= 0 :  3     jQuery.find( sel, this, null, [ cur ] ).length;  4 /*  5  这是handler是方法中过滤委托的方法.等价于  6 if(handleObj.needsContext){  7     match

jQuery学习-事件之绑定事件(三)

在上一篇<jQuery学习-事件之绑定事件(二)>我们了解了jQuery的dispatch方法,今天我们来学习下handlers 方法: handlers: function( event, handlers ) {         var sel, handleObj, matches, i,             handlerQueue = [],             delegateCount = handlers.delegateCount,             cur =

WPF 在事件中绑定命令(可以在模版中绑定命令)

其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是如何构建使用的还不够,很多情况下我们都需要在某个事件触发的时候才去触发命令,所以将命令绑定到事件上是非常有效的做法,下面我们来接着实现将命令绑定到事件中. WPF实现命令绑定到事件 使用 System.Windows.Interactivity.dll 中的 Interaction 可以帮助我们实现

【转载】W3C下的冒泡和捕获机制。到底是冒泡呢。还是捕获呢。一个DOM元素绑定多个事件时如何执行。

原文  http://blog.csdn.net/u011719449/article/details/23787627 在准备阿里前端面试的时候看到这么一道题. 一个DOM元素绑定两个事件,一个冒泡,一个捕获,则事件会执行多少次,执行顺序如何. 这导致了我对冒泡和捕获又进一步深入的了解.(永远都在发现自己知识匮乏的日子中度过人生真是好抓急啊.) 首先冒泡和捕获是怎么一回事. 简单点说.冒泡就是从下往上,像鱼吐泡,泡泡是从下往上升的,也就是DOM元素被触法事件时(此时的dom元素为目标元素),目