手动清空控件事件,手动触发控件事件

 

1: 手动清空某个控件下某个事件注册的委托

2: 手动执行控件某个事件下的所有委托

        /// <summary>
        /// 清空控件指定事件下的事件处理方法
        /// </summary>
        /// <param name="control"></param>
        /// <param name="eventname"></param>
        public static void ClearEvent(this Control control, string eventname)
            {
            var InvocationList = control.GetEventInvocationList(eventname);
            if (InvocationList == null)
                return;
            Type controlType = control.GetType();
            EventInfo eventInfo = controlType.GetEvent(eventname);
            foreach (Delegate dx in InvocationList)
                eventInfo.RemoveEventHandler(control, dx);
            }

        /// <summary>
        /// 手动触发控件的指定事件
        /// </summary>
        /// <param name="control"></param>
        /// <param name="eventname"></param>
        /// <param name="e">事件参数,一般第一个参数sender默认为控件,所以就省略了,只需要传第二个参数</param>
        public static void TriggerEvent(this Control control, string eventname, object e)
            {
            var InvocationList = control.GetEventInvocationList(eventname);
            if (InvocationList == null)
                return;
            foreach (Delegate dx in InvocationList)
                dx.DynamicInvoke(control, e);
            }

        /// <summary>
        /// 获取指定事件的委托
        /// </summary>
        /// <param name="control"></param>
        /// <param name="eventname"></param>
        /// <returns></returns>
        public static Delegate[] GetEventInvocationList(this Control control, string eventname)
            {
            if (control == null) return null;
            if (string.IsNullOrEmpty(eventname)) return null;

            BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.IgnoreCase;
            BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase;
            Type controlType = control.GetType();
            PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
            EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);

            FieldInfo fieldInfo = controlType.GetField("Event" + eventname, mFieldFlags);
            if (fieldInfo == null) fieldInfo = controlType.GetField("Event_" + controlType.Name + eventname, mFieldFlags);//有的控件时需要加上控件类型名作为事件名,
            if (fieldInfo == null) fieldInfo = controlType.GetField(eventname, mFieldFlags);//也许有的不需要加前缀
            //有些事件是继承自 Control ,控件 Type 下没有,比如 ListBox ,所以要从 Control 下找
            if (fieldInfo == null) fieldInfo = typeof(Control).GetField("Event" + eventname, mFieldFlags);
            if (fieldInfo == null) fieldInfo = typeof(Control).GetField("Event_" + controlType.Name + eventname, mFieldFlags);//有的控件时需要加上控件类型名作为事件名,
            if (fieldInfo == null) fieldInfo = typeof(Control).GetField(eventname, mFieldFlags);//也许有的不需要加前缀

            if (fieldInfo == null) return null;
            Delegate d = eventHandlerList[fieldInfo.GetValue(control)];
            if (d == null) return null;

            return d.GetInvocationList();
            }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值