zoukankan      html  css  js  c++  java
  • remove all event handlers from a control

    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();
        }
  • 相关阅读:
    HDU-3555-Bomb
    hihoCoder-1015-KMP
    HDU-1251-统计难题
    hihoCoder-1014-Trie树
    BZOJ-4326: NOIP2015 运输计划 (二分+LCA+树上差分)
    BZOJ-1607: [Usaco2008 Dec]Patting Heads 轻拍牛头 (筛法暴力)
    BZOJ-1419: Red is good (期望DP)
    BZOJ-1798: [Ahoi2009]Seq 维护序列seq & BZOJ-5039: [Jsoi2014]序列维护 (线段树)
    BZOJ-3732: Network (kruskal+LCA)
    BZOJ-1787: [Ahoi2008]Meet 紧急集合 (LCA)
  • 原文地址:https://www.cnblogs.com/zeroone/p/3632239.html
Copyright © 2011-2022 走看看