Cómo eliminar todos los controladores de eventos de un evento

Resuelto Carrick asked hace 16 años • 18 respuestas

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?

Carrick avatar Sep 18 '08 18:09 Carrick
Aceptado

Encontré una solución en los foros de MSDN . El siguiente código de muestra eliminará todos Clicklos 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]);
    }
}
xsl avatar Sep 18 '2008 11:09 xsl

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;
    }
}
Stephen Punak avatar Mar 29 '2011 15:03 Stephen Punak

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();
}
Jorge Ferreira avatar Sep 18 '2008 11:09 Jorge Ferreira