0

私が期待するものと同様の解決策が見つかりません。サブスクライブしたいメソッドにパラメータを追加するにはどうすればよいですか?

以下の行が、mouseover をサブスクライブするコードであるとします。

Panel cagePanel = new Panel();
cagePanel.MouseHover += new EventHandler(frmMain_MouseHover);

void frmMain_MouseHover(object sender, EventArgs e){ 
    // I wanna add some 'int index' parameter after 'e' variable) 
}

私が本当に欲しいのは次のようなものです:

void frmMain_MouseHover(object sender, EventArgs e, int index){ 
    strings[index] = "bla bla bla";
}
4

2 に答える 2

2

私が期待するものと同様の解決策が見つかりません。サブスクライブしたいメソッドにパラメータを追加するにはどうすればよいですか?

できません。イベント (または何でも) を発生させるコードは、提供する値をどのように知るでしょうか?Panel.OnMouseHover

イベントをサブスクライブする時点でわかっている場合は、ラムダ式を使用して基本的に呼び出しを委任し、追加情報を提供できます。

// 10 is just an example here - use whatever value you want for index
cagePanel.MouseHover += (sender, args) => frmMain_MouseHover(sender, args, 10);

編集:配列内の各コントロールを反復処理し、それぞれに適切なハンドラーをサブスクライブするには、次のようなものを使用できます。

for (int i = 0; i < array.Length; i++)
{
    // See http://tinyurl.com/3b2hoft for reasons behind the copy
    int index = i;
    array[i].MouseHover += (s, args) => frmMain_MouseHover(s, args, index);
}

sender私は個人的にこれを必要としないようにしますが、潜在的に使用して、部分を介してインデックスを検出できませんArray.IndexOfか?

于 2012-10-05T16:07:59.463 に答える
2

できませんが、必要な追加データがイベントの送信元に関連している場合は、sender値を使用できます。たとえば、イベントを発生させた項目のコントロールのリスト内のインデックスを知りたい場合は、次のようにすることができます。

int i = controlList.IndexOf(sender);    
于 2012-10-05T16:12:29.280 に答える