社区
C#
帖子详情
如何清理掉一个按钮Click事件的所有注册的方法
zhangxuguang2007
2010-01-15 12:55:38
我有一个按钮,想要一次性清空在Click事件中注册的方法,前提是我不知道Click中注册了多少方法。
我不希望使用操作符“-=”,而是类似于Clear的方法来实现。
希望各位大虾给段代码或者思路也好
...全文
674
22
打赏
收藏
如何清理掉一个按钮Click事件的所有注册的方法
我有一个按钮,想要一次性清空在Click事件中注册的方法,前提是我不知道Click中注册了多少方法。 我不希望使用操作符“-=”,而是类似于Clear的方法来实现。 希望各位大虾给段代码或者思路也好
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
事件
总不能写n个类似的回调函数吧: 可以使用,如下的
方法
: local function OnInitial(self) XRNActivityWrapper.gameObject = self.gameObject local button = self.gameObject.transform:Find("Button1"):...
vue的
事件
处理的所有
方法
vue的
事件
处理的所有
方法
用及其概括
android eclipse
按钮
事件
,android eclipse
按钮
的On
Click
事件
- java
我在main_activity.xml中做了
一个
按钮
这是代码片段:xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:background="@drawable/splash_background"andr...
JS中的
事件
委托和移除
事件
处理程序
事件
委托利用
事件
冒泡,只指定
一个
事件
处理程序,就可以管理某一类型的所有
事件
。例如,
click
事件
会一直冒泡到documeng层次,也就是说我们可以为整个页面指定
一个
on
click
事件
处理程序,而不必给每
一个
可单击的元素...
JQuery中的
事件
(六.移除
事件
)
1.为同
一个
元素绑定多个
事件
;2.清除指定
注册
的
事件
unbind("
click
"),和所有
注册
事件
unbind(); 3.删除指定函数名
事件
unbind("functionname"); 4.指定
事件
触发1次
C#
111,119
社区成员
642,537
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章