:だから、単純にすべての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");
}
次
注:
- これは奇妙なことがしたいようです。私は、あなたの問題に近づくより良い方法があるように感じます(それはX-Yの問題のようです)。
- これはイベントから退会しません。同様の種類のコードを使用して、代わりに
.RemoveEventHandler()
を呼び出すだけで、フォームのdisposeメソッドでそれを行う必要があります。
リフレクションを使用して指定されたイベントを見つけることはできますが、ここでの問題はハンドラコードの指定です。ハンドラがどのように見えると思いますか?異なるイベントは、異なる引数を持つことができます。 –
@MatthewWatson in .netハンドラは、処理しているイベントに応じて特定の定義を持つ必要があると思います。私はマウスを検索しているので、私はこの場合mousedownの適切な定義を持っていると期待しています。 – codemonkeyliketab
これは 'MouseDown'のためのものですか? 'Control'には' MouseDown'イベントがあります。チェックする必要はありません。 –