社区
C#
帖子详情
如何清理掉一个按钮Click事件的所有注册的方法
zhangxuguang2007
2010-01-15 12:55:38
我有一个按钮,想要一次性清空在Click事件中注册的方法,前提是我不知道Click中注册了多少方法。
我不希望使用操作符“-=”,而是类似于Clear的方法来实现。
希望各位大虾给段代码或者思路也好
...全文
637
22
打赏
收藏
如何清理掉一个按钮Click事件的所有注册的方法
我有一个按钮,想要一次性清空在Click事件中注册的方法,前提是我不知道Click中注册了多少方法。 我不希望使用操作符“-=”,而是类似于Clear的方法来实现。 希望各位大虾给段代码或者思路也好
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhangxuguang2007
2010-01-25
打赏
举报
回复
[Quote=引用 20 楼 lianshaohua 的回复:]
只有添加事件的人才有权限移除事件,这也是一层封装,否则就乱掉了,一个程序员有可能把其它程序员所添加的事件删除。。。结果不可预料,如果真的想要清除,继承或许可以达到,反射没有试过。。。。。。
[/Quote]
说的没错,我最后觉得是我的设计有问题,因此我改变了设计思路,这个问题就不存在了!
boringame
2010-01-15
打赏
举报
回复
[Quote=引用 20 楼 lianshaohua 的回复:]
只有添加事件的人才有权限移除事件,这也是一层封装,否则就乱掉了,一个程序员有可能把其它程序员所添加的事件删除。。。结果不可预料,如果真的想要清除,继承或许可以达到,反射没有试过。。。。。。
[/Quote]
顶
只有添加事件的人,和空间内部可以移除,这是处于安全考虑。
否者的话事件这个概念形同虚设,和委托就没有差别了。
ztenv
2010-01-15
打赏
举报
回复
只有添加事件的人才有权限移除事件,这也是一层封装,否则就乱掉了,一个程序员有可能把其它程序员所添加的事件删除。。。结果不可预料,如果真的想要清除,继承或许可以达到,反射没有试过。。。。。。
nimingxin1987
2010-01-15
打赏
举报
回复
额...貌似不行呢...我继续研究一下
nimingxin1987
2010-01-15
打赏
举报
回复
[Quote=引用 16 楼 zhangxuguang2007 的回复:]
引用 15 楼 javak 的回复:
FieldInfo keyfi = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object eventkey = keyfi.GetValue(button1);
// Get the protected Events property
PropertyInfo evtpi = typeof(Control).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList evts = (EventHandlerList)evtpi.GetValue(button1, null);
// Obtain the value of the delegate and remove it
Delegate dlg = evts[eventkey];
evts.RemoveHandler(eventkey, dlg);
我测试通过的.
如果我有一个treeview,然后想要清掉其中的AfterSelect事件如何做呢?
[/Quote]
把button1改成你的rreeview名就可以了
nimingxin1987
2010-01-15
打赏
举报
回复
[Quote=引用 15 楼 javak 的回复:]
FieldInfo keyfi = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object eventkey = keyfi.GetValue(button1);
// Get the protected Events property
PropertyInfo evtpi = typeof(Control).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList evts = (EventHandlerList)evtpi.GetValue(button1, null);
// Obtain the value of the delegate and remove it
Delegate dlg = evts[eventkey];
evts.RemoveHandler(eventkey, dlg);
我测试通过的.
[/Quote]
完全可行,牛X,学习了...
zhangxuguang2007
2010-01-15
打赏
举报
回复
[Quote=引用 15 楼 javak 的回复:]
FieldInfo keyfi = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object eventkey = keyfi.GetValue(button1);
// Get the protected Events property
PropertyInfo evtpi = typeof(Control).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList evts = (EventHandlerList)evtpi.GetValue(button1, null);
// Obtain the value of the delegate and remove it
Delegate dlg = evts[eventkey];
evts.RemoveHandler(eventkey, dlg);
我测试通过的.
[/Quote]
如果我有一个treeview,然后想要清掉其中的AfterSelect事件如何做呢?
JavaK
2010-01-15
打赏
举报
回复
FieldInfo keyfi = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object eventkey = keyfi.GetValue(button1);
// Get the protected Events property
PropertyInfo evtpi = typeof(Control).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList evts = (EventHandlerList)evtpi.GetValue(button1, null);
// Obtain the value of the delegate and remove it
Delegate dlg = evts[eventkey];
evts.RemoveHandler(eventkey, dlg);
我测试通过的.
xiongxyt2
2010-01-15
打赏
举报
回复
Click也不过就是一个委托变量,只是增加事件的属性和方法,完全可以通过赋NULL的方式将其一次性清空
zhangxuguang2007
2010-01-15
打赏
举报
回复
10楼的方法曾经令我很激动,可是fi=null到底是怎么回事?
nimingxin1987
2010-01-15
打赏
举报
回复
10楼在吗?那个方法跑通了,不过
FieldInfo fi =
ei.DeclaringType.GetField(ei.Name,
BindingFlags.NonPublic |
BindingFlags.Instance);
之后fi=null
最后还是没清楚掉,不太懂啊
WM_JAWIN
2010-01-15
打赏
举报
回复
继承这个按钮,然后 new 一个click 事件。将父类中的click隐藏。编代码响应父类的click事件,并激法自己的click事件。 再添加一个clearClick()方法。将click设为null即可。
wzp144650
2010-01-15
打赏
举报
回复
用反射
http://www.cnblogs.com/ncindy/articles/685186.html
元宇宙之家
2010-01-15
打赏
举报
回复
如果实在着急,你就
Button a=new Button()
把旧Button的属性copy到a上
this.Controls.Add(a);
mengzulin
2010-01-15
打赏
举报
回复
this.Object.Click += new System.EventHandler(this.Object_Click);
this.Object.Click -= new System.EventHandler(this.Object_Click);
nimingxin1987
2010-01-15
打赏
举报
回复
其实,我真的很想看看4楼能用null成功清空事件的代码
zhangxuguang2007
2010-01-15
打赏
举报
回复
= NULL肯定不行,会直接报编译错误
BATTLERxANGE
2010-01-15
打赏
举报
回复
能设置NULL?事件只能出现在+=或者-=的左边吧!
Uncle_Yong
2010-01-15
打赏
举报
回复
首先看看“Click”是怎么定义的:
public event EventHandler Click;
而EventHandler得定义是这样的:
public delegate void EventHandler(object sender, EventArgs e);
可见Click也不过就是一个委托变量,只是增加事件的属性和方法,完全可以通过赋NULL的方式将其一次性清空。
nimingxin1987
2010-01-15
打赏
举报
回复
-=是最简单的
麻烦点的就是或者你到InitializeComponent()把btn1的生成代码
//
// button1
//
this.button1.Location = new System.Drawing.Point(55, 26);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 1;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
生成一个方法,每次点btn2的时候就先把btn1销毁,然后执行上边这个方法
不过这个方法很笨,也有很多限制性
加载更多回复(2)
xlua获取ugui的button
注册
click
事件
或者: local button = self.gameObject.transform:Find(“Button”):GetComponent(“Button”)
vue的
事件
处理的所有
方法
vue的
事件
处理的所有
方法
用及其概括
android eclipse
按钮
事件
,android eclipse
按钮
的On
Click
事件
- java
我有2个文件:main_activity.xml和home.xml。我在main_activity.xml中做了
一个
按钮
这是代码片段:xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:background="@drawable/splash_background"andr...
JS中的
事件
委托和移除
事件
处理程序
1.什么是
事件
委托?对“
事件
处理程序过多”的问题的解决方案就是
事件
委托。
事件
委托利用
事件
冒泡,只指定
一个
事件
处理程序,就可以管理某一类型的所有
事件
。例如,
click
事件
会一直冒泡到documeng层次,也就是说我们可以为整个页面指定
一个
on
click
事件
处理程序,而不必给每
一个
可单击的元素分别添加
事件
处理程序。如下代码://html
html清空
按钮
代码,HTML DOM console.clear()用法及代码示例
HTML中的console.clear()
方法
用于清除控制台,并在每次执行时在控制台上写一些消息“Console was cleared”。此
方法
不需要任何参数。用法:console.clear()以下示例程序旨在说明HTML中的console.clear()
方法
:例:DOM console.clear() Method in HTMLh1 {color:green;}h2 {font-famil...
C#
111,097
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章