反射清除所有事件问题.button可以EventClick找到,NumericUpDown的事件找不到.

autoid1 2013-03-05 05:57:42
Button的Click事件.我用EventClick找到了所有Delegate.
NumericUpDown的ValueChanged事件.我用EventValueChanged找不到Delegate.
怎么办.
用的是以前高手写的方法.
希望各位大神赐教。
 public static Delegate[] GetObjectEventList<T>(T p_Control, string p_EventName)
{
PropertyInfo _PropertyInfo = p_Control.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
if (_PropertyInfo != null)
{
object _EventList = _PropertyInfo.GetValue(p_Control, null);
if (_EventList != null && _EventList is EventHandlerList)
{
EventHandlerList _List = (EventHandlerList)_EventList;
FieldInfo _FieldInfo = (typeof(Control)).GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic);
if (_FieldInfo == null) return null;
Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Control)];
if (_ObjectDelegate == null) return null;
return _ObjectDelegate.GetInvocationList();
}
}
return null;
}

或者有其他方法清除所有ValueChanged事件的委托也可以.
...全文
222 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
autoid1 2013-03-07
  • 打赏
  • 举报
回复
未解决.送分.
autoid1 2013-03-06
  • 打赏
  • 举报
回复
引用 15 楼 lye2000000_super 的回复:
帮不了你了。。。。。。。
不管怎样.还是谢谢.
  • 打赏
  • 举报
回复
帮不了你了。。。。。。。
autoid1 2013-03-06
  • 打赏
  • 举报
回复
引用 13 楼 lye2000000_super 的回复:
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; ……
fieldInfo不为空了.但是 Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; 这个变量d为空.还是不能继续下去. 你的代码试了不能清除事件哦.
  • 打赏
  • 举报
回复
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; BindingFlags mPropertyFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase |BindingFlags.Static; BindingFlags mFieldFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static; Type controlType = control.GetType(); PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags); EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null); String name = "Event" + eventname; FieldInfo fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = "Event_" + controlType.Name + eventname; fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = name.ToUpper(); fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { fieldInfo = controlType.GetField("onValueChanged", mFieldFlags); } } } Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; if (d == null) return; EventInfo eventInfo = controlType.GetEvent(eventname); foreach (Delegate dx in d.GetInvocationList()) eventInfo.RemoveEventHandler(control, dx); } 你绑定了事件了?我绑定了。也找到了。。。
  • 打赏
  • 举报
回复
用我的那个方法。你把程序复制过去就能找到。 我这已经找到了。
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 10 楼 lye2000000_super 的回复:
fieldInfo = controlType.GetField(“onValueChanged”, mFieldFlags);
onValueChanged OnValueChanged 或者前面加Event也是返回空 fieldInfo .
  • 打赏
  • 举报
回复
fieldInfo = controlType.GetField(“onValueChanged”, mFieldFlags);
  • 打赏
  • 举报
回复
找了下。叫onValueChanged
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 7 楼 lye2000000_super 的回复:
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; ……
还是同样的问题哦.fieldInfo 等于 null. 各种尝试都是这样.
  • 打赏
  • 举报
回复
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; BindingFlags mPropertyFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase |BindingFlags.Static; BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic; Type controlType = control.GetType(); PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags); EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null); String name = "Event" + eventname; FieldInfo fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = "Event_" + controlType.Name + eventname; fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = name.ToUpper(); fieldInfo = controlType.GetField(name, mFieldFlags); } } Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; if (d == null) return; EventInfo eventInfo = controlType.GetEvent(eventname); foreach (Delegate dx in d.GetInvocationList()) eventInfo.RemoveEventHandler(control, dx); } 这个有可能好使。
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 2 楼 lye2000000_super 的回复:
那个时间的名字不对。肯定不是叫这个 跟button的不一样。
可以帮忙看看是什么名字吗.或者告诉我从哪里找. 这是winForm自带的控件.
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 4 楼 gxingmin 的回复:
if (_EventList != null && _EventList is EventHandlerList)这句设个断点,看 _EventList 变量
这里没报错. 走到下一行: FieldInfo _FieldInfo = 这里就为空了.
gxingmin 2013-03-05
  • 打赏
  • 举报
回复
if (_EventList != null && _EventList is EventHandlerList)这句设个断点,看 _EventList 变量
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
你跟踪一下ValueChanged事件时什么类型? 可能不是EventHandlerList类型吧,你监控一下看看
怎么监控它是不是EventHandlerList?.
namespace System.Windows.Forms
{
    // 摘要:
    //     表示显示数值的 Windows 数字显示框(也称作 up-down 控件)。
    [ComVisible(true)]
    [DefaultBindingProperty("Value")]
    [SRDescription("DescriptionNumericUpDown")]
    [DefaultProperty("Value")]
    [DefaultEvent("ValueChanged")]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class NumericUpDown : UpDownBase, ISupportInitialize
    {
      //
        // 摘要:
        //     在以某种方式更改 System.Windows.Forms.NumericUpDown.Value 属性后发生。
        [SRCategory("CatAction")]
        [SRDescription("NumericUpDownOnValueChangedDescr")]
        public event EventHandler ValueChanged;
  • 打赏
  • 举报
回复
那个时间的名字不对。肯定不是叫这个 跟button的不一样。
gxingmin 2013-03-05
  • 打赏
  • 举报
回复
你跟踪一下ValueChanged事件时什么类型? 可能不是EventHandlerList类型吧,你监控一下看看

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧