1

C#でコントロールの配列を作成する場合、クリックされたボタンのインデックスを受け取る関数をクリックイベントにバインドするにはどうすればよいですか?

理解を深めるためだけにいくつかのコードを示します。コードのどこかでボタンを定義します。

Button [] buttons = new Button[100];

それらの標準のClickイベントは次のようになります。

private void myClick(object sender, EventArgs e)
{

}

そして通常、あなたはそれをこのようにバインドします:

for (int i = 0; i < 100; i++)
    buttons[i].Click += myClick;

ただし、イベントハンドラーを次の形式にする必要があります。

private void myClick(int Index)
{

}

暫定関数の有無にかかわらず、クリックイベントを上記の関数にバインドするにはどうすればよいですか?

Func<T, TResult>デリゲートや表記法を使用するか、クリックしたボタンのインデックスを含むカスタムEventArgsをなんとかして渡すことを考えました。しかし、C#に関する十分な知識がなかったため、成功しませんでした。

各コントロールのインデックスをタグに保存することを提案する場合:はい、可能でしたが、何らかのイベントをスローするクラスがあるが、プロパティなどにタグを付けると、この方法は役に立ちません。

4

2 に答える 2

6
int index = i;    
buttons[index].Click += (sender, e) => myClick(index);

以下のコメントに投稿されているように、「i」を使用すると、スコープが原因ですべてのコントロールに同じ変数が使用されます。したがって、ラムダ式と同じスコープで新しい変数を作成する必要があります。

于 2011-06-22T11:16:12.153 に答える
2
private void myClick(object sender, EventArgs e)
{
    int index = buttons.IndexOf(sender as Button);
}
于 2011-06-22T11:16:36.063 に答える