- PR -

フォームデザインのオブジェクト名を変数名で指定

投稿者投稿内容
和也さん
ベテラン
会議室デビュー日: 2006/02/09
投稿数: 78
投稿日時: 2006-03-23 09:03
VB.NETのコントロールでの質問なのですが、
例えばテキストボックスを5個配置しているとして、
コードからテキストボックスに値を入力する際、
変数名を指定するようなことは可能でしょうか?

Dim ObjectName as String = "TextBox1"

ObjectName.Text="テスト1"

ObjectName="TextBox2"

ObjectName.Text="テスト2"

上記のようなことが行いたいのですが、可能でしょうか?
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-03-23 09:28
 下記のような処理ではだめなのでしょうか?

コード:
Protected WithEvents text1 As System.Web.UI.WebControls.TextBox
Protected WithEvents text2 As System.Web.UI.WebControls.TextBox
Protected WithEvents text3 As System.Web.UI.WebControls.TextBox

dim text as TextBox

text = text1
text.Text = "テキスト1"

text = text2
text.Text = "テキスト2"

text = text3
text.Text = "テキスト3"




 どうしてもコントロール名から設定したいのであれば、フォームオブジェクト
などからFindControlで該当の名称のコントロールを検索し、設定することになる
と思います。

コード:
Dim name as String

name = "text1"
CType(FindControl(name), TextBox).Text = "テキスト1"

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-03-23 10:14
これASP.NETの話ですか?
それなら悠さんの方法でできますね。
WindowsフォームのプログラムならControl.Nameプロパティでいけます。
あと、WebでもWindowsフォームでも、リフレクションを使うこともできます。

いずれにしても、もう一回作りを考え直してみた方がいいですね。
コンパイル時にエラーを見つけられないですからね。
(IDの文字列を打ち間違えるとか、IDで処理をしていると気付かずに修正する時にIDを変えてしまうとか)


[ メッセージ編集済み 編集者: 一郎 編集日時 2006-03-23 10:15 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-23 10:32
Windows Form だとして以下の方法があります。

  フォーム内のコントロールを名前で探して取得する

リンク先にも書いていますが、コンパイル解決できないのでお勧めできません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
くー
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 86
投稿日時: 2006-07-20 11:58
期間が経ってますが^^;
Control.Nameで出来るとはどのような記述でしょうか?

Dim ctrl As New Control

Dim s() as string = {"0", "1", "2", "3", "4"}
Dim i as integer = 0
Do while i < 5
ctrl.Name = "テキスト" + cstr(i + 1)
ctrl.Text = s(i)
Loop

このようにテキスト1〜5までに値を入れようとしたのですが
上手くテキスト1.Textには入りませんでした。
(ctrl.textには入っていましたが)
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-07-20 12:09

じゃんぬさんがお示しになったリンク先をご覧ください。
Name プロパティが使われてるでしょう?
// くーさんがお考えのとは異なったところで
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-20 12:21
念のためですが、
Name プロパティでの実装は先にも書いたとおりお勧めできません。

デザイン時はともかく、実行時は一意である保証がありません。
リフレクションを使用して取得した方が、まだマシだと思います。

まあ、「コンパイル解決できない」 というのが最も大きな理由です...
.NET Framework 2.0 からはできますが、こちらも当然お勧めできません。

# (何故、こんなに要望があるんでしょうね...)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
くー
ベテラン
会議室デビュー日: 2005/02/07
投稿数: 86
投稿日時: 2006-07-20 14:03
見本通りFindControl関数を置き、

Dim s() As String = {"0", "1", "2", "3", "4"}
Dim i As Integer = 0
Do while i < 5
Dim ctrl As Control = FindControl(Me, "テキスト" + cstr(i + 1))
ctrl.Text = s(i)
i = i + 1
Loop

とやったら上手く行きました!
今回急ぎの用でしたのでこの方法で。
リフレクションはあとで勉強しておきます。
Hongliangさん、じゃんぬさん有難うございました。

[ メッセージ編集済み 編集者: くー 編集日時 2006-07-20 14:05 ]

スキルアップ/キャリアアップ(JOB@IT)