tablelayoutpanel内のLabelコントロール


marllbolo  2012-05-19 20:14:15  No: 143303  IP: 192.*.*.*

バージョンはVB2010です。

tablelayoutpanel内のLabelコントロールで

For i as Integer = 0 to 100
TableLayoutPanel1.Controls("Label" & i).Text = i
TableLayoutPanel1.Controls("Label" & i).BackColor = Color.Blue
TableLayoutPanel1.Controls("Label" & i).ForeColor = Color.White
Next

などはできるのですが、

TableLayoutPanel1.Controls("Label" & i).TextAlign = ContentAlignment.MiddleRight

のようなことができません。入力支援欄にもそれらしいものが出てこなかったのですが、これはそういうものとあきらめるしかないのでしょうか。

もしなかったとしたら、別に方法があるのでしょうか?

連続の質問ですみませんが、宜しくお願いします。

編集 削除
魔界の仮面弁士  2012-05-20 18:59:29  No: 143304  IP: 192.*.*.*

TableLayoutPanel1.Controls("Label" & i) や TableLayoutPanel1.GetControlFromPosition から
返される値のデータ型が、『Control クラス』であることに注意してください。

Control クラスには Text / BackColor / ForeColor プロパティがありますが、
Control クラスに TextAlign プロパティはありません。(Label や TextBox にならありますが)


> 別に方法があるのでしょうか?
本来のデータ型にキャストしてあげれば OK です。

DirectCast(TableLayoutPanel1.Controls("Label" & i), Label).TextAlign = ContentAlignment.MiddleRight


あるいは Linq を使う手法もあります。

'Label1〜Label100 以外の名前のラベルが含まれる場合は、Where などでフィルタリングする
For Each lbl In TableLayoutPanel1.Controls.OfType(Of Label)()
    lbl.Text = lbl.Name.Substring("Label".Length)
    lbl.TextAlign = ContentAlignment.MiddleRight
    lbl.BackColor = Color.Blue
    lbl.ForeColor = Color.White
Next

------

上記のほかにも、レイトバインドを利用する手法があります。

具体的には、Object 型に対するアクセスするとか、
  CObj(TableLayoutPanel1.Controls("Label" & i)).TextAlign = ContentAlignment.MiddleRight
もしくは、CallByName を利用するという方法です。
  CallByName(TableLayoutPanel1.Controls("Label" & i), "TextAlign", CallType.Set, ContentAlignment.MiddleRight)

ただしこれらの手法だと、開発時における入力ヒント(IntelliSense)の支援が受けられませんし、
スペルミス(TextAlign → TextArain など)があっても、コンパイル時点では検出されません。
そのため、レイトバインドを利用することはあまりお奨めしません。

編集 削除