如图:委托有关问题
如图:委托问题

如图所示:
UFGrid是存在某个dll中的,我引用的它的时候能找到他的事件GridHeadClicked,以及他的委托GridHeadClicked,
,怎么才能找到该委托绑定的方法呢?其实就是列头点击事件,
我想找到这个方法,通过-= 取消掉这个事件。
网上搜了很久,有的说可以反射,但是方法名是什么呢? ,或者有没有能监控委托,就能知道他所对应的事件列表,以及方法列表。
谢谢
------解决思路----------------------
肯定不能用函数名了。你例子中相当于bind了一个lambda。
a.eventHandler += 不需要写成new 的形式。
a.eventHandler += () => {}; 即可。
------解决思路----------------------
当ug被gc的时候,这个delegate就被回收了。
不可以。
------解决思路----------------------
可以清空事件委托链(清空这个事件+=过的所有方法)
------解决思路----------------------
你是不是想要改动某些行为?要看你改什么
你想改动的东西不一定是外部挂入的,也可能由内部产生,事件只是给第三方一个触发的机会
比如说按钮的点击事件,你不挂接委托,不代表这个按钮不会被点击(视觉效果的改变)
所以我猜你想改的东西不一定是这个事件
------解决思路----------------------
那你就修改源代码呗。或者如果你没有源代码,那么你就自己另外定义一个组件/控件,封装人家的组件/控件,你另外触发一套事件机制呗。
如果你说这个也不是你要做的,如果你说你是就要人家的原本的东西而出“鬼了”,那么你得动机就很可疑了。
年底了,小偷程序也多了啊。昨天我放在窗口下面5、6米的电动车的车座和电瓶被人拆走偷了,报警也没用。好可恶的小偷。
------解决思路----------------------
设计良好的控件是把所有触发事件的方法都写成virtual的,会有很多 protected virtual void OnXXX 这种方法。这样用户就可以通过继承的方式,override这个方法,里面不调用base上的方法,而是自己写逻辑就好了。如果这个控件不是这么设计的,只能说它不是个好控件。
------解决思路----------------------
给你的只是网上随便找的参考,仔细看了下那代码,改成下面这样试试
ClearEvent(Control pControl, string pEventName)
{
Type controlType = pControl.GetType(); //获取控件的实际类型,而不是Control基础类型
EventInfo eventInfo=controlType.GetEvent(pEventName);
foreach (Delegate dx in d.GetInvocationList())
eventInfo.RemoveEventHandler(pControl, dx);//移除已订阅的pEventName类型事件
}
------解决思路----------------------
支持#10, #11楼,两个一起应该能解决楼主的问题,如果还不能解决,那估计是控件里面有意防这一手。
所以归根结底,支持#9楼
------解决思路----------------------
你可以根据 这个事件的参数 来判断
看看 点击列头 时 的参数 是什么
点击 其他地方的参数是什么
之后取消这个事件
------解决思路----------------------
如果是一个dll 的话 方便的话可以发给我
我研究一下
------解决思路----------------------
引用完dll后 你本地按照那个委托定义的格式写个事件处理函数注册进去不就行嘛
如图所示:
UFGrid是存在某个dll中的,我引用的它的时候能找到他的事件GridHeadClicked,以及他的委托GridHeadClicked,
,怎么才能找到该委托绑定的方法呢?其实就是列头点击事件,
我想找到这个方法,通过-= 取消掉这个事件。
网上搜了很久,有的说可以反射,但是方法名是什么呢? ,或者有没有能监控委托,就能知道他所对应的事件列表,以及方法列表。
谢谢
------解决思路----------------------
肯定不能用函数名了。你例子中相当于bind了一个lambda。
a.eventHandler += 不需要写成new 的形式。
a.eventHandler += () => {}; 即可。
------解决思路----------------------
当ug被gc的时候,这个delegate就被回收了。
不可以。
------解决思路----------------------
可以清空事件委托链(清空这个事件+=过的所有方法)
void ClearEvent(Control pControl, string pEventName)
{
if (pControl== null) return;
if (string.IsNullOrEmpty(pEventName)) return;
BindingFlags mPropertyFlags = BindingFlags.Instance
------解决思路----------------------
BindingFlags.Public
------解决思路----------------------
BindingFlags.Static
------解决思路----------------------
BindingFlags.NonPublic;//筛选
BindingFlags mFieldFlags = BindingFlags.Static
------解决思路----------------------
BindingFlags.NonPublic;
Type controlType = typeof(System.Windows.Forms.Control);
PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(pControl, null);//事件列表
FieldInfo fieldInfo = (typeof(Control)).GetField("Event" + pEventName, mFieldFlags);
Delegate d = eventHandlerList[fieldInfo.GetValue(pControl)];
if (d == null) return;
EventInfo eventInfo=controlType.GetEvent(pEventName);
foreach (Delegate dx in d.GetInvocationList())
eventInfo.RemoveEventHandler(pControl, dx);//移除已订阅的pEventName类型事件
}
------解决思路----------------------
你是不是想要改动某些行为?要看你改什么
你想改动的东西不一定是外部挂入的,也可能由内部产生,事件只是给第三方一个触发的机会
比如说按钮的点击事件,你不挂接委托,不代表这个按钮不会被点击(视觉效果的改变)
所以我猜你想改的东西不一定是这个事件
------解决思路----------------------
那你就修改源代码呗。或者如果你没有源代码,那么你就自己另外定义一个组件/控件,封装人家的组件/控件,你另外触发一套事件机制呗。
如果你说这个也不是你要做的,如果你说你是就要人家的原本的东西而出“鬼了”,那么你得动机就很可疑了。
年底了,小偷程序也多了啊。昨天我放在窗口下面5、6米的电动车的车座和电瓶被人拆走偷了,报警也没用。好可恶的小偷。
------解决思路----------------------
设计良好的控件是把所有触发事件的方法都写成virtual的,会有很多 protected virtual void OnXXX 这种方法。这样用户就可以通过继承的方式,override这个方法,里面不调用base上的方法,而是自己写逻辑就好了。如果这个控件不是这么设计的,只能说它不是个好控件。
------解决思路----------------------
这个我试过,我不是知道是不是只有微软的控件那里Events, 我的返回的是null..
给你的只是网上随便找的参考,仔细看了下那代码,改成下面这样试试
ClearEvent(Control pControl, string pEventName)
{
Type controlType = pControl.GetType(); //获取控件的实际类型,而不是Control基础类型
EventInfo eventInfo=controlType.GetEvent(pEventName);
foreach (Delegate dx in d.GetInvocationList())
eventInfo.RemoveEventHandler(pControl, dx);//移除已订阅的pEventName类型事件
}
------解决思路----------------------
支持#10, #11楼,两个一起应该能解决楼主的问题,如果还不能解决,那估计是控件里面有意防这一手。
所以归根结底,支持#9楼
------解决思路----------------------
你可以根据 这个事件的参数 来判断
看看 点击列头 时 的参数 是什么
点击 其他地方的参数是什么
之后取消这个事件
------解决思路----------------------
如果是一个dll 的话 方便的话可以发给我
我研究一下
------解决思路----------------------
引用完dll后 你本地按照那个委托定义的格式写个事件处理函数注册进去不就行嘛