UFGrid是存在某个dll中的,我引用的它的时候能找到他的事件GridHeadClicked,以及他的委托GridHeadClicked,
,怎么才能找到该委托绑定的方法呢?其实就是列头点击事件,
我想找到这个方法,通过-= 取消掉这个事件。
网上搜了很久,有的说可以反射,但是方法名是什么呢? ,或者有没有能监控委托,就能知道他所对应的事件列表,以及方法列表。
谢谢
a.eventHandler += 不需要写成new 的形式。
a.eventHandler += () => {}; 即可。
—-
你好,,上面的图,我只是随便写个不报错的,没有什么意义
你的意思是:
a.eventHandler -= () => {};
就相当于我对这个委托在dll中绑定的事件解绑了?
—-
现在我的问题是:
ug.GridHeadClicked -= new GridHeadClicked(这里的参数是实现方法,因为dll中是找不到这个方法的, 这里应该填什么才能解除这个绑定呢 );
—- 10分
不可以。
—- 10分
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类型事件 }
—-
可以清空事件委托链(清空这个事件+=过的所有方法)
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类型事件 }
这个我试过,我不是知道是不是只有微软的控件那里Events, 我的返回的是null..
—-
当ug被gc的时候,这个delegate就被回收了。
肯定不能用函数名了。你例子中相当于bind了一个lambda。
a.eventHandler += 不需要写成new 的形式。
a.eventHandler += () => {}; 即可。
你好,,上面的图,我只是随便写个不报错的,没有什么意义
你的意思是:
a.eventHandler -= () => {};
就相当于我对这个委托在dll中绑定的事件解绑了?不可以。
那咋整呢?
—- 10分
你想改动的东西不一定是外部挂入的,也可能由内部产生,事件只是给第三方一个触发的机会
比如说按钮的点击事件,你不挂接委托,不代表这个按钮不会被点击(视觉效果的改变)
所以我猜你想改的东西不一定是这个事件
—- 10分
如果你说这个也不是你要做的,如果你说你是就要人家的原本的东西而出“鬼了”,那么你得动机就很可疑了。
年底了,小偷程序也多了啊。昨天我放在窗口下面5、6米的电动车的车座和电瓶被人拆走偷了,报警也没用。好可恶的小偷。
—- 10分
—- 10分
这个我试过,我不是知道是不是只有微软的控件那里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分
所以归根结底,支持#9楼
—-
你是不是想要改动某些行为?要看你改什么
你想改动的东西不一定是外部挂入的,也可能由内部产生,事件只是给第三方一个触发的机会
比如说按钮的点击事件,你不挂接委托,不代表这个按钮不会被点击(视觉效果的改变)
所以我猜你想改的东西不一定是这个事件
其实就是一套框架,里面有些标准控件,封装的时候就默认了某些事件, 现在我要取消这些事件。
—-
那你就修改源代码呗。或者如果你没有源代码,那么你就自己另外定义一个组件/控件,封装人家的组件/控件,你另外触发一套事件机制呗。
如果你说这个也不是你要做的,如果你说你是就要人家的原本的东西而出“鬼了”,那么你得动机就很可疑了。
年底了,小偷程序也多了啊。昨天我放在窗口下面5、6米的电动车的车座和电瓶被人拆走偷了,报警也没用。好可恶的小偷。
诶。。。这个是用友的标准的产品的上的dll….我只是在上面做二次开发,向集团提的解决办法,他只是简单的回复取消这个委托的绑定。。。告诉了我UFGrid这个类。。
—-
设计良好的控件是把所有触发事件的方法都写成virtual的,会有很多 protected virtual void OnXXX 这种方法。这样用户就可以通过继承的方式,override这个方法,里面不调用base上的方法,而是自己写逻辑就好了。如果这个控件不是这么设计的,只能说它不是个好控件。
他里面的设计,绝对是标准,规范的。。你说的virtual也没错,不过只有基本的事件定义成virtual,像加载页面的各个周期,我这个是Girdheadclick ,
—- 10分
看看 点击列头 时 的参数 是什么
点击 其他地方的参数是什么
之后取消这个事件
—- 5分
我研究一下
—- 5分