414 votes

Comment supprimer tous les gestionnaires d'événements d'un contrôle

Pour créer un nouveau gestionnaire d'événements sur un contrôle, vous pouvez le faire

 c.Click += new EventHandler(mainFormButton_Click);
 

ou ca

 c.Click += mainFormButton_Click;
 

et pour supprimer un gestionnaire d'événements, vous pouvez le faire

 c.Click -= mainFormButton_Click;
 

Mais comment supprimer tous les gestionnaires d'événements d'un contrôle?

183voto

xsl Points 7362

J'ai trouvé une solution sur les forums MSDN . Le code exemple ci - dessous supprime tous les Click des événements 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]);
        }
    }
}
 

178voto

Stephen Punak Points 645

Vous êtes trop dur sur vous-même. C'est facile:

 void OnFormClosing(object sender, FormClosingEventArgs e)
{
    foreach(Delegate d in FindClicked.GetInvocationList())
    {
        FindClicked -= (FindClickedHandler)d;
    }
}
 

86voto

smink Points 39640

De http://bytes.com/forum/thread274921.html

Directement non, en grande partie parce que vous ne pouvez pas simplement définir l'événement à null.

Indirectement, vous pouvez rendre l'événement réel privé et créer une propriété autour de celui-ci qui suit tous les délégués qui y sont ajoutés / soustraits.

Prenez ce qui suit:

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

70voto

LionSoft Points 416

La réponse acceptée n'est pas complète. Cela ne fonctionne pas pour les événements déclarés comme {add; retirer;}

Voici le code de travail:

     public static void ClearEventInvocations(this object obj, string eventName)
    {
        var fi = obj.GetType().GetEventField(eventName);
        if (fi == null) return;
        fi.SetValue(obj, null);
    }

    private static FieldInfo GetEventField(this Type type, string eventName)
    {
        FieldInfo field = null;
        while (type != null)
        {
            /* Find events defined as field */
            field = type.GetField(eventName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
            if (field != null && (field.FieldType == typeof(MulticastDelegate) || field.FieldType.IsSubclassOf(typeof(MulticastDelegate))))
                break;

            /* Find events defined as property { add; remove; } */
            field = type.GetField("EVENT_" + eventName.ToUpper(), BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
            if (field != null)
                break;
            type = type.BaseType;
        }
        return field;
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X