如图:委托问题

dengixnyu 2014-12-01 04:59:12

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

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

谢谢
...全文
285 18 打赏 收藏 转发到动态 举报
写回复
用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 += () => {}; 即可。

110,556

社区成员

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

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

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