1

一連のコントロールをフォームに動的に追加しています。各コントロールは同じメソッドを呼び出します。そのメソッドでは、アクションを実行したコントロールの配列インデックスを知る必要があります。

CheckBox[] myCB = new CheckBox[100];
int i;
for (i = 0; i < 100; i++)
{
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += new System.EventHandler(dynamicbutton_Click);
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    label1.Text = sender.???array index property???.ToString();
}

したがって、クリックmyCB[42] label1すると「42」と表示されます。もちろん、動的コントロールを処理する簡単な方法がある場合は、ポインターをいただければ幸いです。

4

4 に答える 4

5
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    label1.Text = Array.IndexOf(myCB, (CheckBox)sender).ToString();
}
于 2009-06-09T17:50:25.730 に答える
3

コントロールにはTagプロパティが必要です。たぶん、あなたはタグにインデックスを付けることができます。ただし、ボクシングが発生します...

于 2009-06-09T17:48:52.880 に答える
3
int j = i;
myCB[i].Click += delegate(object sender, EventArgs e) {
 // here you can use "j"

};
于 2009-06-09T17:52:23.543 に答える
2

明らかな解決策の1つは、タグを設定することです。

CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += new System.EventHandler(dynamicbutton_Click);
    myCB[i].Tag = i;
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

それで:

private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    Control control = (Control) sender;
    label1.Text = sender.Tag.ToString();
}

もう1つの方法は、イベントハンドラーで情報をキャプチャすることです。最も簡単な方法は、ラムダ式または匿名メソッドを使用することです。

CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
    int index = i; // This is very important, as otherwise i will
                  // be captured for all of them
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += (s, e) => label1.Text = index.ToString();
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

または、より複雑な動作の場合:

CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
    int index= i; // This is very important, as otherwise i will
                  // be captured for all of them
    myCB[i] = new CheckBox();
    myCB[i].Text = "Clicky!";
    myCB[i].Click += (s, e) => DoSomethingComplicated(index, s, e);
    tableLayoutPanel1.Controls.Add(myCB[i]);
}

(適切に宣言するDoSomethingComplicated場合)。

于 2009-06-09T17:50:43.470 に答える