C#按钮单击操作以替换所有其他按钮?

C#按钮单击操作以替换所有其他按钮?,c#,event-handling,action,buttonclick,C#,Event Handling,Action,Buttonclick,我想知道如何为按钮单击设置EventHandler,以便它可以替换此对象的所有其他处理程序。理想情况下,它应该是这样的: button1.Click = MessageBox.Show("Run just this!"); //Yes, the '=' instead of the '+='. 这是因为button1已经有一些单击事件,我想在确定的情况下覆盖所有其他事件 更多示例: button1.Click += MessageBox.Show("Event #1 has been trig

我想知道如何为按钮单击设置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!");

根据设计,您通常无法取消其他呼叫者的预订。这是因为它们与你无关。您可以使用反射来绕过它,但几乎可以肯定,它是一个非常重要的事件处理列表。如果你是我们分类的控制,你可以覆盖OnClick这样做,但它仍然似乎。。。反社会的

如果你是订阅所有这些的人,你可以简单地。。。不要订阅您不想运行的内容。

您可以试试这个

在这个问题上有一个解决方案。下面的示例代码将从
按钮1
中删除所有
单击事件

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

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]);
        }
    }
}

第一个GetValue(在静态键上)不应该传递null吗?这会起作用,但违反了很多设计原则。我建议OP不要使用这种方法,而是重新考虑他们的订阅方式。特别是:您不知道的事情可能是取消订阅。我知道这是不推荐的,但它是针对应用程序的创新性代码专用设计,已经有8k行代码,因此任何其他解决方案都可能需要数月的维护。我们只是想走另一条路,这里!