remove all event handlers from a control

5323 ワード

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]);

        }

    }

}

or
void OnFormClosing(object sender, FormClosingEventArgs e)

{

    foreach(Delegate d in FindClicked.GetInvocationList())

    {

        FindClicked -= (FindClickedHandler)d;

    }

}

or
    Directly no, in large part because you cannot simply set the event to null.



    Indirectly, you could make the actual event private and create a property around it that tracks all of the delegates being added/subtracted to it.



    Take the following:



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

    }