3

私はwinFormでアプリケーションを書いています。from1 にパネルがあり、多くのイベント ハンドラーがあります。panel1 を破棄して新しい panel を作成すると、以前のイベントが存在し、それらが発生します。panel1 イベントを削除するために、以下のコードを試しました。

panel1.Click -=  clickHandle_1 ; 

しかし、プログラム コードのどこでも機能するわけではありません。たとえば、別の方法で。新しい panel1 を作成するときに、 panel1 の以前のすべてのイベントを削除するにはどうすればよいですか?

4

4 に答える 4

9

thisによると、 panel1 のすべてのクリック イベントをキャンセルするには、次のようにします。

FieldInfo f1 = typeof(Control).GetField("EventClick", BindingFlags.Static| BindingFlags.NonPublic);
object obj = f1.GetValue(panel1);
PropertyInfo pi = panel1.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)pi.GetValue(panel1, null);
list.RemoveHandler(obj, list[obj]);

また、panel1 の他のイベントをキャンセルするEventClickには、削除したいイベント名に変更します。

次のコードを使用して、すべてのイベント名を取得できます。

EventInfo[] info = type.GetEvents();
for (int i = 0; i < info.Length; i++)
{
   Console.WriteLine(info[i].Name + "\n");
}
于 2013-09-13T09:27:55.550 に答える
4

通常、オブジェクト/コントロールの場合Dispose、そのオブジェクト/コントロールのすべてのメンバーも破棄され、 unusableEvent handler listになる必要があります。したがって、 と言うと、破棄されたコントロール ( など) でイベントを発生させることはできません。パネルを確実に廃棄するかどうかを確認する必要があります。(type of )を使用して、コントロールのすべてを削除するために使用できる方法を次に示します。your panel1 is disposedResizeEvent handlersReflectionDisposeEventsEventHandlerList

public void RemoveHandlerList(Control c){
  EventHandlerList list = (EventHandlerList) typeof(Control).GetProperty("Events", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(c, null);
  typeof(EventHandlerList).GetMethod("Dispose").Invoke(list, null);
}
于 2013-09-13T08:26:42.990 に答える
3

一度に 1 つずつ削除します。

panel1.Click -= clickHandle_1;

すべてのイベント ハンドラーを一度にサブスクライブ解除するクリーンな方法はありません。購読しているものを追跡し、それに応じて購読を解除してください。

于 2013-09-12T20:36:40.773 に答える
0

これが機能するかどうかはわかりませんが、これは私が思いついた最も近いものです:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    private Dictionary<string, EventHandler> _handlers = new Dictionary<string, EventHandler>();
    TextBox _txt = new TextBox();

    void WireHandlers()
    {

         // get references of your handlers
         EventHandler _hnd1 = delegate { return; }; // here will be your named method. This is only for example
         EventHandler _hnd2 = delegate { return; }; // here will be your named method. This is only for example

         // wire handlers
        _txt.Click += _hnd1;
        _txt.TextChanged  += _hnd2;
         // save wired handler collection
        _handlers.Add("Click", _hnd1);
        _handlers.Add("TextChanged", _hnd2);
    }


    void UnwireHandlers()
    {

        // lets unwire all handlers
        foreach (var kvp in _handlers)
        {
            // inspect keyValuePair - each key corresponds to the name of some event
            switch (kvp.Key)
            {
                case "Click":
                    _txt.Click -= kvp.Value;
                    break;
                case "TextChanged":
                    _txt.TextChanged  -= kvp.Value;
                    break;
                default:
                    throw new Exception("no such handler found");
            }
        }

        _handlers.Clear();
    }

}
于 2013-09-12T22:30:38.890 に答える