How to remove all event handlers from an event

后端 未结 18 1591
再見小時候
再見小時候 2020-11-22 01:20

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

c.Click += new EventHandler(mainFormButton_Click);

or this

c.Cli         


        
18条回答
  •  旧巷少年郎
    2020-11-22 02:00

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

提交回复
热议问题