不定期TomBlog

目次

Blog 利用状況

書庫

FindControlとリフレクション φ(..)

恥ずかしながら、つい最近知りました。

WebFormでHoge1, Hoge2, …, HogeN というラベルなりテキストなり、何かしらのコントロールがあるとします。

この場合に“Hoge”という部分は変わらないので、ループして一括で処理させたい!と思ったのですが、どうすれば実現できるのかわからず、調べてみると、FindControl という便利なメソッドがありました。

for (int i = 1; i <= 10; i++)
{
    ((Label)FindControl("Hoge" + i.ToString())).Text = i.ToString();
}

とすると、10個のテキストに対して、順番に値が代入されます。

 

ほな、メソッドやプロパティの名称がHoge1, Hoge2, …, HogeNの場合はどうするねん。

ありました。System.Reflection名前空間のMethodInfoクラスとPropertyInfoクラス。

文字列で指定したメソッドを呼び出すには?

 

じゃぁ、Hoge1, Hoge2, …, HogeNってゆうローカル変数は?

……わからん。

おとなしく配列にしなさいってことでしょうか?

投稿日時 : 2007年4月14日 13:17

コメントを追加

# re: FindControlとリフレクション φ(..) 2007/04/14 14:23 Hirotow

コントロールは普通非公開フィールドなので、
using System;
using System.Reflection;

Type type = this.GetType();
FieldInfo[] fields = type.GetFields();
foreach(FieldInfo field in fields)
{
if(field.Name.StartsWith('Hoge'))
{
Control ctrl = field.GetValue(this) as Control;
//ctrlに対して処理を行う
}
}
のような感じになると思います。
ちなみに同様の方法でフォーム内の非公開メンバまで参照できます。

# re: FindControlとリフレクション φ(..) 2007/04/14 15:12 じゃんぬねっと

ローカル変数には名前というものが存在しないので、基本的にリフレクションの適用がムリです。

# re: FindControlとリフレクション φ(..) 2007/04/14 15:50 Hirotow

>ローカル変数には名前というものが存在しないので、基本的にリフレクションの適用がムリです。
あ、そか。
しかもローカル変数にできるならリフレクかける必要もなさそうですが。
もしScopeInfoクラスとかあったらかえって面白いですね。

# re: FindControlとリフレクション φ(..) 2007/04/14 20:23 なちゃ

>コントロールは普通非公開フィールドなので、

特にコントロールではこれはやっちゃだめです。
さてなぜでしょう。

※他のはいいのかってまあそういう問題ではないですが。

# re: FindControlとリフレクション φ(..) 2007/04/14 20:24 なちゃ

あ、非公開「だから」だめというのとはまた別の理由ですよ。

# re: FindControlとリフレクション φ(..) 2007/04/14 21:33 Hirotow

わかりません(汗

# re: FindControlとリフレクション φ(..) 2007/04/14 22:32 Tom

>特にコントロールではこれはやっちゃだめです。
>さてなぜでしょう。

どうしてですか?

# re: FindControlとリフレクション φ(..) 2007/04/14 22:40 なちゃ

VBは無視ならまぁいいんですけどね。

# FsHAMovTqhoVeFI 2012/01/04 6:43 http://www.kosherbeefjerky.com/

uCnqIj I serched through the internet and got here. What a wonderful invention of the mankind. With the help of the network you communicate, learn, read !... That helped us to get acquainted!...

タイトル
名前
URL
コメント