2017-01-27 13 views
0

私は、フォームからすべてのクリックイベントを削除する方法の良い例を発見した:Closingイベントを削除するには?

private void RemoveClickEvent(Form c) 
{ 
    var f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic); 
    var obj = f1.GetValue(c); 
    var pi = c.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); 
    var list = (EventHandlerList)pi.GetValue(c, null); 
    list.RemoveHandler(obj, list[obj]); 
} 

をし、それがうまく動作します。しかし、私が必要とするのは、閉会のイベントを削除することですが、私はそれを動作させるためにEventClickの代わりに何を書き込むかの手がかりがありません。私はEventClosingClosingと書こうとしましたが、うまくいきませんでした。したがって、私の質問は:それは動作するように変更する必要がありますか?さらに良い - 私はClosedFormClosingFormClosedのような他のイベントを削除する必要がある場合がありますので、にそこにすべての可能な入力のリストを見つけたい、など

P.S.単純な-=は、多くのイベントが添付されている可能性があります。そのうちの多くが私にはアクセスできないので、とにかく削除することはできません。私はこれでこれらのイベント名のリストが出ているコメントで述べたように

+0

フォースフォームを閉じないようにしますか? –

+0

いいえ、実際は全く反対です - 標準クローズ以外のイベントは一切発生せずにクローズしたいと思います。たとえば、フォームに「保存されていない変更がありますか?」というメッセージボックスが表示されないようにしたいと思います。 –

+0

フォームを閉じるかクリックしようとすると、メッセージボックスに質問が表示されますか?私はあなたの問題を完全に理解することができませんでしたが、メッセージボックスを表示するコードを削除できませんか? –

答えて

0

public static class Utils 
{ 
    public static void DisableEvents<T>(this T ctrl, string officialName, string simplifiedName) where T : Control 
    { 
     var propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); 
     var eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList; 
     var fieldInfo = typeof(T).GetField(officialName, BindingFlags.NonPublic | BindingFlags.Static); 
     var eventKey = fieldInfo.GetValue(ctrl); 
     var eventHandler = eventHandlerList[eventKey]; 
     var invocationList = eventHandler.GetInvocationList(); 

     foreach (var item in invocationList) 
     { 
      ctrl.GetType().GetEvent(simplifiedName).RemoveEventHandler(ctrl, item); 
     } 
    } 
} 

と使用方法:

typeof(Form).GetFields(BindingFlags.NonPublic | BindingFlags.Static).AsEnumerable().ToList(); 

今、私はこのようになります方法を持っています次のようになります。

myForm.DisableEvents<Form>("EVENT_CLOSING", "Closing"); 

残念ながら私はまだ1つのPAを渡す方法を考え出していません私の方法に邪魔になる。

関連する問題