0

我想知道如何为按钮单击设置 EventHandler,以便它替换此对象的所有其他处理程序。理想情况下,它会是这样的:

button1.Click = MessageBox.Show("Run just this!"); //Yes, the '=' instead of the '+='.

这是因为 button1 已经有一些点击事件,我想在确定的情况下覆盖所有其他的。

更多示例:

button1.Click += MessageBox.Show("Event #1 has been triggered!");
button1.Click += MessageBox.Show("Event #2 and #1 have been triggered!");
button1.Click = MessageBox.Show("Event #3, and only #3, has been triggered!");
4

2 回答 2

1

你可以试试这个...

MSDN 论坛上有解决方案。下面的示例代码将删除所有Click事件button1

您可以在按钮上保留一个事件.....

public partial class Form1 : Form
{
        public Form1()
        {
            InitializeComponent();

            button1.Click += button1_Click;
            button1.Click += button1_Click2;
            button2.Click += button2_Click;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello");
        }

        private void button1_Click2(object sender, EventArgs e)
        {
            MessageBox.Show("World");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            RemoveClickEvent(button1);
        }

        private void RemoveClickEvent(Button b)
        {
            FieldInfo f1 = typeof(Control).GetField("EventClick", 
                BindingFlags.Static | BindingFlags.NonPublic);
            object obj = f1.GetValue(b);
            PropertyInfo pi = b.GetType().GetProperty("Events",  
                BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
            list.RemoveHandler(obj, list[obj]);
        }
    }
}
于 2011-11-05T10:13:39.330 回答
0

按照设计,您通常不能取消订阅其他呼叫者。这是因为它们不是你关心的。您可以使用反射来绕过它,但几乎可以肯定它是一个非常重要的 EventHandlerList。如果您是我们对控件进行分类,您可以覆盖 OnClick 来执行此操作,但它似乎仍然......反社会。

如果你是订阅所有这些的人,你可以简单地......不订阅你不想运行的东西。

于 2011-11-05T10:10:01.860 回答