5つの文字列変数があり、実行時にそれらに「Foo」を割り当てたいとします。
これの代わりに
string a1 = "Foo";
string a2 = "Foo";
string a3 = "Foo";
string a4 = "Foo";
string a5 = "Foo";
このようなものを使用することはできません:
for(int i = 0;i < 5;i++)
{
a+i = "Foo";
}
同様の方法でそれらにアクセスすることは不可能ですか?
Label[] labels = new Label[] { label1, label2, label3, label4, label5 };
for (int i = 0; i < labels.Length; i++)
{
labels[i].Text = "Foo";
}
他の人が言っているように、配列(または別のコレクション)はこれを行うためのはるかに優れた方法です。
配列は、常にインデックスでアクセスする変数のコレクションであると考えてください。
質問に示されているように、変数のセットが必要になる理由は考えられません。どうしてもそうする必要があり、それらがインスタンス/静的変数である場合、本当に必要な場合はリフレクションを使用してそれらにアクセスできますが、配列または他のコレクションを使用する方がはるかに優れています。
ラベルの親のコントロールを反復処理することで、次のことができます。
for (int i=0; i<= parent.controls.count(); i++)
{
if (parent.controls("label" + i) != null)
{
...
}
}
HTH
編集:
編集後、私がそれを行うのを見ることができる唯一の方法は、それらをリスト/配列/辞書に追加し、それを繰り返すことですが、原則は同じです。
名前でコントロールにアクセスできますが、ラベルアイテムの配列をページに追加してから、整数を使用して配列にアクセスする方がはるかにクリーンです。
すべてのラベルに同じ親があり、その親に他のラベルコントロールが含まれていない場合は、次の操作を実行できます。
foreach (Control lbl in ParentControl)
{
if (lbl is TextBox)
{
((Label)lbl).Text = "Foo";
}
}
ラベルの配列または配列リストを作成し、それらにラベルを配置できます。次に、これと同様のことを行うことができます。
ここでWebフォームについて話していると仮定すると、使用できるFindControl()メソッドがあります。
private void Button1_Click(object sender, EventArgs MyEventArgs)
{
// Find control on page.
TextBox myControl1 = (TextBox) FindControl("Label1");
if(myControl1!=null)
{
string message = myControl1.Text;
}
}