Monday, February 4, 2019

c# - How to remove all event handlers from an event




To create a new event handler on a control you can do this



c.Click += new EventHandler(mainFormButton_Click);


or this



c.Click += mainFormButton_Click;



and to remove an event handler you can do this



c.Click -= mainFormButton_Click;


But how do you remove all event handlers from an event?


Answer



I found a solution on the MSDN forums. The sample code below will remove all Click events from 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]);
}
}
}

No comments:

Post a Comment

plot explanation - Why did Peaches' mom hang on the tree? - Movies & TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...