如图:委托问题

dengixnyu 2014-12-01 04:59:12

如图所示:
UFGrid是存在某个dll中的,我引用的它的时候能找到他的事件GridHeadClicked,以及他的委托GridHeadClicked,
,怎么才能找到该委托绑定的方法呢?其实就是列头点击事件,
我想找到这个方法,通过-= 取消掉这个事件。

网上搜了很久,有的说可以反射,但是方法名是什么呢? ,或者有没有能监控委托,就能知道他所对应的事件列表,以及方法列表。

谢谢
...全文
291 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
smthgdin_020 2014-12-03
  • 打赏
  • 举报
回复
引用完dll后 你本地按照那个委托定义的格式写个事件处理函数注册进去不就行嘛
_小黑_ 2014-12-03
  • 打赏
  • 举报
回复
如果是一个dll 的话 方便的话可以发给我 我研究一下
_小黑_ 2014-12-03
  • 打赏
  • 举报
回复
你可以根据 这个事件的参数 来判断 看看 点击列头 时 的参数 是什么 点击 其他地方的参数是什么 之后取消这个事件
dengixnyu 2014-12-03
  • 打赏
  • 举报
回复
引用 10 楼 github_22161131 的回复:
设计良好的控件是把所有触发事件的方法都写成virtual的,会有很多 protected virtual void OnXXX 这种方法。这样用户就可以通过继承的方式,override这个方法,里面不调用base上的方法,而是自己写逻辑就好了。如果这个控件不是这么设计的,只能说它不是个好控件。
他里面的设计,绝对是标准,规范的。。你说的virtual也没错,不过只有基本的事件定义成virtual,像加载页面的各个周期,我这个是Girdheadclick ,
dengixnyu 2014-12-03
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
那你就修改源代码呗。或者如果你没有源代码,那么你就自己另外定义一个组件/控件,封装人家的组件/控件,你另外触发一套事件机制呗。 如果你说这个也不是你要做的,如果你说你是就要人家的原本的东西而出“鬼了”,那么你得动机就很可疑了。 年底了,小偷程序也多了啊。昨天我放在窗口下面5、6米的电动车的车座和电瓶被人拆走偷了,报警也没用。好可恶的小偷。
诶。。。这个是用友的标准的产品的上的dll....我只是在上面做二次开发,向集团提的解决办法,他只是简单的回复取消这个委托的绑定。。。告诉了我UFGrid这个类。。
dengixnyu 2014-12-03
  • 打赏
  • 举报
回复
引用 8 楼 layershow 的回复:
你是不是想要改动某些行为?要看你改什么 你想改动的东西不一定是外部挂入的,也可能由内部产生,事件只是给第三方一个触发的机会 比如说按钮的点击事件,你不挂接委托,不代表这个按钮不会被点击(视觉效果的改变) 所以我猜你想改的东西不一定是这个事件
其实就是一套框架,里面有些标准控件,封装的时候就默认了某些事件, 现在我要取消这些事件。
  • 打赏
  • 举报
回复
引用 6 楼 dengixnyu 的回复:
这个我试过,我不是知道是不是只有微软的控件那里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类型事件 }
winnowc 2014-12-02
  • 打赏
  • 举报
回复
设计良好的控件是把所有触发事件的方法都写成virtual的,会有很多 protected virtual void OnXXX 这种方法。这样用户就可以通过继承的方式,override这个方法,里面不调用base上的方法,而是自己写逻辑就好了。如果这个控件不是这么设计的,只能说它不是个好控件。
枫0子K 2014-12-02
  • 打赏
  • 举报
回复
支持#10, #11楼,两个一起应该能解决楼主的问题,如果还不能解决,那估计是控件里面有意防这一手。 所以归根结底,支持#9楼
  • 打赏
  • 举报
回复
那你就修改源代码呗。或者如果你没有源代码,那么你就自己另外定义一个组件/控件,封装人家的组件/控件,你另外触发一套事件机制呗。 如果你说这个也不是你要做的,如果你说你是就要人家的原本的东西而出“鬼了”,那么你得动机就很可疑了。 年底了,小偷程序也多了啊。昨天我放在窗口下面5、6米的电动车的车座和电瓶被人拆走偷了,报警也没用。好可恶的小偷。
layershow 2014-12-01
  • 打赏
  • 举报
回复
你是不是想要改动某些行为?要看你改什么 你想改动的东西不一定是外部挂入的,也可能由内部产生,事件只是给第三方一个触发的机会 比如说按钮的点击事件,你不挂接委托,不代表这个按钮不会被点击(视觉效果的改变) 所以我猜你想改的东西不一定是这个事件
dengixnyu 2014-12-01
  • 打赏
  • 举报
回复
引用 4 楼 healer_kx 的回复:
当ug被gc的时候,这个delegate就被回收了。 [quote=引用 2 楼 dengixnyu 的回复:] [quote=引用 1 楼 healer_kx 的回复:] 肯定不能用函数名了。你例子中相当于bind了一个lambda。 a.eventHandler += 不需要写成new 的形式。 a.eventHandler += () => {}; 即可。
你好,,上面的图,我只是随便写个不报错的,没有什么意义 你的意思是: a.eventHandler -= () => {}; 就相当于我对这个委托在dll中绑定的事件解绑了? [/quote] 不可以。[/quote] 那咋整呢?
dengixnyu 2014-12-01
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
可以清空事件委托链(清空这个事件+=过的所有方法)

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..
  • 打赏
  • 举报
回复
可以清空事件委托链(清空这个事件+=过的所有方法)

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类型事件
 
        }
healer_kx 2014-12-01
  • 打赏
  • 举报
回复
当ug被gc的时候,这个delegate就被回收了。
引用 2 楼 dengixnyu 的回复:
[quote=引用 1 楼 healer_kx 的回复:] 肯定不能用函数名了。你例子中相当于bind了一个lambda。 a.eventHandler += 不需要写成new 的形式。 a.eventHandler += () => {}; 即可。
你好,,上面的图,我只是随便写个不报错的,没有什么意义 你的意思是: a.eventHandler -= () => {}; 就相当于我对这个委托在dll中绑定的事件解绑了? [/quote] 不可以。
dengixnyu 2014-12-01
  • 打赏
  • 举报
回复
引用 1 楼 healer_kx 的回复:
肯定不能用函数名了。你例子中相当于bind了一个lambda。 a.eventHandler += 不需要写成new 的形式。 a.eventHandler += () => {}; 即可。
现在我的问题是: ug.GridHeadClicked -= new GridHeadClicked(这里的参数是实现方法,因为dll中是找不到这个方法的, 这里应该填什么才能解除这个绑定呢 );
dengixnyu 2014-12-01
  • 打赏
  • 举报
回复
引用 1 楼 healer_kx 的回复:
肯定不能用函数名了。你例子中相当于bind了一个lambda。 a.eventHandler += 不需要写成new 的形式。 a.eventHandler += () => {}; 即可。
你好,,上面的图,我只是随便写个不报错的,没有什么意义 你的意思是: a.eventHandler -= () => {}; 就相当于我对这个委托在dll中绑定的事件解绑了?
healer_kx 2014-12-01
  • 打赏
  • 举报
回复
肯定不能用函数名了。你例子中相当于bind了一个lambda。 a.eventHandler += 不需要写成new 的形式。 a.eventHandler += () => {}; 即可。
1. HTML对象获取问题 3 2. const问题 3 3. event.x与event.y问题 3 4. window.location.href问题 3 5. frame问题 3 6. 模态和非模态窗口问题 3 7. firefox与IE的父元素(parentElement)的区别 3 8. document.formName.item(”itemName”) 问题 3 9. 集合类对象问题 3 10. 自定义属性问题 3 11. input.type属性问题 3 12. event.srcElement问题 3 13. body载入问题 3 14. 事件委托方法 3 15. Table操作问题 3 16. 对象宽高赋值问题 3 Ø CSS 3 1. cursor:hand VS cursor:pointer 3 2. innerText在IE中能正常工作,但在FireFox中却不行. 3 3. CSS透明 3 4. css中的width和padding 3 5. FF和IE BOX模型解释不一致导致相差2px 3 6. IE5 和IE6的BOX解释不一致 3 7. ul和ol列表缩进问题 3 8. 元素水平居中问题 3 9. Div的垂直居中问题 3 10. margin加倍的问题 3 11. IE与宽度和高度的问题 3 12. 页面的最小宽度 3 13. DIV浮动IE文本产生3象素的bug 3 14. IE捉迷藏的问题 3 15. float的div闭合;清除浮动;自适应高度 3 16. 高度不适应 3 17. IE6下图片下有空隙产生 3 18. 对齐文本与文本输入框 3 19. LI中内容超过长度后以省略号显示 3 20. 为什么web标准中IE无法设置滚动条颜色了 3 21. 为什么无法定义1px左右高度的容器 3 22. 链接(a标签)的边框与背景 3 23. 超链接访问过后hover样式就不出现的问题 3 24. FORM标签 3 25. 属性选择器(这个不能算是兼容,是隐藏css的一个bug) 3 26. 为什么FF下文本无法撑开容器的高度 3

111,097

社区成员

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

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

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