如何清理掉一个按钮Click事件的所有注册的方法

zhangxuguang2007 2010-01-15 12:55:38
我有一个按钮,想要一次性清空在Click事件中注册的方法,前提是我不知道Click中注册了多少方法。

我不希望使用操作符“-=”,而是类似于Clear的方法来实现。

希望各位大虾给段代码或者思路也好
...全文
637 22 打赏 收藏 转发到动态 举报
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
  • 打赏
  • 举报
回复
元宇宙之家 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)

111,097

社区成员

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

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

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