How to remove all event handlers from an event

后端 未结 18 1590
再見小時候
再見小時候 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 01:40

    This page helped me a lot. The code I got from here was meant to remove a click event from a button. I need to remove double click events from some panels and click events from some buttons. So I made a control extension, which will remove all event handlers for a certain event.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Reflection;
    public static class EventExtension
    {
        public static void RemoveEvents(this T target, string eventName) where T:Control
        {
            if (ReferenceEquals(target, null)) throw new NullReferenceException("Argument \"target\" may not be null.");
            FieldInfo fieldInfo = typeof(Control).GetField(eventName, BindingFlags.Static | BindingFlags.NonPublic);
            if (ReferenceEquals(fieldInfo, null)) throw new ArgumentException(
                string.Concat("The control ", typeof(T).Name, " does not have a property with the name \"", eventName, "\""), nameof(eventName));
            object eventInstance = fieldInfo.GetValue(target);
            PropertyInfo propInfo = typeof(T).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
            EventHandlerList list = (EventHandlerList)propInfo.GetValue(target, null);
            list.RemoveHandler(eventInstance, list[eventInstance]);
        }
    }
    

    Now, the usage of this extenstion. If you need to remove click events from a button,

    Button button = new Button();
    button.RemoveEvents(nameof(button.EventClick));
    

    If you need to remove doubleclick events from a panel,

    Panel panel = new Panel();
    panel.RemoveEvents(nameof(panel.EventDoubleClick));
    

    I am not an expert in C#, so if there are any bugs please forgive me and kindly let me know about it.

提交回复
热议问题