2016-06-24 3 views
0

どのように動作するか疑似コードですが、これを達成するためにどのような.netメソッドを呼び出す必要があるかわかりません。フォームのすべてのコントロールをループし、イベントが存在する場合コントロールを追加するハンドラーを追加します

Dim specifiedEvent = "MouseDown" 
    Dim handler = handler 
    For Each control As Control in form.controls 
     If control has specifiedEvent Then 

     control.specifiedEvent addhandler handler 

     End If 
    Next 

C#は、それが簡単に

+1

リフレクションを使用して指定されたイベントを見つけることはできますが、ここでの問題はハンドラコードの指定です。ハンドラがどのように見えると思いますか?異なるイベントは、異なる引数を持つことができます。 –

+0

@MatthewWatson in .netハンドラは、処理しているイベントに応じて特定の定義を持つ必要があると思います。私はマウスを検索しているので、私はこの場合mousedownの適切な定義を持っていると期待しています。 – codemonkeyliketab

+0

これは 'MouseDown'のためのものですか? 'Control'には' MouseDown'イベントがあります。チェックする必要はありません。 –

答えて

3

をVBに変換することができますので、私はので、ここで、VBで私のC#の試みあまりよくないよリンクされている:

foreach(Control c in form.Controls) 
    c.GetType().GetEvent(specifiedEvent)?.AddMethod?.Invoke(c, new object[] {handler}); 

Type.GetEvent()は用EventInfoを返します。指定された名前のイベント、またはそのようなイベントが存在しない場合はnullです。このEventInfoAddMethodプロパティは、そのイベントのaddメソッドのMethodInfoです。

これはC#6です。したがって、実際にイベントが存在するかどうかを確認するために、nullチェック(null伝播/無効条件演算子?を使用)を追加する必要があります。


Controlクラス自体がMouseDownイベントを宣言していますので、あなたの質問にのみMouseDownイベントについて、それは、少し奇妙だされた場合。したがってから継承されたクラスControlにはこのイベントがあります(このイベントを意図的に隠しているクラスを扱っている場合を除く)。人々はすでにあなただけ「のMouseDown」を探しているならば、チェックする必要がない、指摘したように

foreach(Control c in form.Controls) 
    c.MouseDown += handler; 
+1

私は妄想か、誰かが私を狩っているのですか?これは3回目です_today_そうでなければうまく受信された答えについての説明なしでdownvoteを取得します... –

+0

それが起こると迷惑を掛けます。人々は少なくとも説明を与えるべきです(問題が何であるかは明白でない限り - ここではそうではありません)。 –

+0

私が返そうとしていた答えは、 'MouseDown'イベントを持つすべてのコントロールについてのあなたのコメントと同じでした。私はdownvoterではないが、多分それは良い答えですか?私はあなたのコメントを複製するには何のポイントも答えようとしていませんでした。 –

1

:だから、単純にすべてのControl秒にイベントを追加することができます。

しかし、ハンドラの名前とイベントの名前を文字列として指定したイベントにハンドラを割り当てるリフレクションを使用するアプローチが必要な場合は、このようにすることができます。あなたのマウスダウンハンドラは次のようになり、一例として、

public void HookUp(Control container, string handlerName, string eventName) 
{ 
    MethodInfo eventHandler = this.GetType().GetMethod(handlerName, BindingFlags.NonPublic | BindingFlags.Instance); 

    foreach (var control in container.Controls.Cast<Control>()) 
    { 
     var ev = control.GetType().GetEvent(eventName); 

     if (ev == null) 
      continue; 

     var d = Delegate.CreateDelegate(ev.EventHandlerType, this, eventHandler); 
     ev.AddEventHandler(control, d); 
    } 
} 

このコードは、指定された名前に一致するイベントとコンテナコントロールにネスト各コントロールにイベントハンドラをアタッチ

private void mouseEventHandler(object sender, MouseEventArgs e) 
{ 
    Debug.WriteLine(e.Button); 
} 

そして、あなたは、このような(たとえば、フォームのコンストラクタなど)適切な場所からそれを呼び出すことができます。

public Form1() 
{ 
    InitializeComponent(); 
    HookUp(this, "mouseEventHandler", "MouseDown"); 
} 

注:

  1. これは奇妙なことがしたいようです。私は、あなたの問題に近づくより良い方法があるように感じます(それはX-Yの問題のようです)。
  2. これはイベントから退会しません。同様の種類のコードを使用して、代わりに.RemoveEventHandler()を呼び出すだけで、フォームのdisposeメソッドでそれを行う必要があります。
関連する問題