C#按钮单击操作以替换所有其他按钮?
我想知道如何为按钮单击设置EventHandler,以便它可以替换此对象的所有其他处理程序。理想情况下,它应该是这样的: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
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行代码,因此任何其他解决方案都可能需要数月的维护。我们只是想走另一条路,这里!