Cómo eliminar todos los controladores de eventos de un evento
Para crear un nuevo controlador de eventos en un control, puede hacer esto
c.Click += new EventHandler(mainFormButton_Click);
o esto
c.Click += mainFormButton_Click;
y para eliminar un controlador de eventos puedes hacer esto
c.Click -= mainFormButton_Click;
Pero, ¿cómo se eliminan todos los controladores de eventos de un evento?
Aceptado
Encontré una solución en los foros de MSDN . El siguiente código de muestra eliminará todos Click
los eventos de 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]);
}
}
Ustedes están haciendo que esto sea demasiado difícil para ustedes mismos. Es así de fácil:
void OnFormClosing(object sender, FormClosingEventArgs e)
{
foreach(Delegate d in FindClicked.GetInvocationList())
{
FindClicked -= (FindClickedHandler)d;
}
}
Desde Eliminar todos los controladores de eventos :
Directamente no, en gran parte porque no se puede simplemente establecer el evento como nulo.
Indirectamente, puede hacer que el evento real sea privado y crear una propiedad a su alrededor que rastree a todos los delegados que se agregan o restan.
Tome lo siguiente:
List<EventHandler> delegates = new List<EventHandler>(); private event EventHandler MyRealEvent; public event EventHandler MyEvent { add { MyRealEvent += value; delegates.Add(value); } remove { MyRealEvent -= value; delegates.Remove(value); } } public void RemoveAllEvents() { foreach(EventHandler eh in delegates) { MyRealEvent -= eh; } delegates.Clear(); }