C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか?
C#2008ですが、Form1にTextBoxが30個あって、textBox1~textBox30という名前がついています。
このテキストボックスの値をForm2で取得したいのですがなかなかうまくいきません。
-------------------------
Form2:
private void Form2_Click(object sender, EventArgs e){
Form1 fm = new Form1();
int No = 15; //ここを1~30まで動的にしたい
string result = fm.textBox15.Text; //直接comboBox_type15と書くのではなく「"comboBox_type" + No.ToString()」のようにしたい
MessageBox.Show(result);
}
-------------------------
コントロールを配列にして
Control[] ctlArray = new Control[30] { fm.textBox1, fm.textBox2, …, fm.textBox30 };
のようにしてみましたが、エラーになってしまいます。
いろいろネットで検索してみたのですが、「コントロール名を動的に文字列で作成して使う」という方法がどこにも載っていなく、数時間格闘しています。
すみませんがご教授願います。よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
どう回答したものかとかなり悩みました。
いろいろな考え方があるので。。。
コンストラクタのオーバーロードで自分自分を渡すという
suffreさんの方法もなるほどーと思いました。
「あり」だと思います。
他に方法がいくつかあります。
2つだけ紹介します。
ひとつは、
fm.ShowDialog(this);
と、Owner指定なるものを使って、自分を渡す方法です。
これが一番楽かな、と思っています。
渡されたForm2の方では、
this.OwnerをForm1でキャストすれば、
suffreさんの方法と同じようにForm1のPublicのメンバに
アクセスできます。
例えば、
((Form1)this.Owner).textBox3.Text = "hoge";
です。
オーバーロードとか書かなくていいのでその点簡単でしょう。
もう一つは、Form2の側にPublicなメンバ(特にプロパティ)を
設けて、それを通じてやり取りする、という方法です。
Form1の側では、
Form2 fm2 = new Form2();
としたあと、
fm2.xxx = ・・・
で必要な情報を相手に渡し、
textBox3.Text = fm2.yyy;
というように情報を受け取ります。
DialogResultの値は見ないのでしょうか?
もし見て、それがOKの場合のみ、Form2の側で設定された値を
使いたいという場合、以下のようになるはずです。
if (fm2.ShowDialog(this)== DialogResult.OK) {
textBox3.Text = fm2.yyy;
}
もちろん、初めの方法でも、予めForm1の側で変更される可能性の
あるメンバをバックアップしておいて、Cancelだったらそれを使って
元に戻すということもできますが。。。
。。。
初めの方法を嫌がる人は(おそらくたくさん)います。
・Form2の側にForm1という文字を書かなくてはならない
→ 子は親に依存させたくない
・Form1の側でForm2でForm1の値変更の管理ができない
などという理由からです。
後者の方法ならば、
・Form2の側にForm1という文字を書かないで済む
・最終的に、Form2側で入れた値を使うかどうかがForm1側で分かる
からです。
丸岡孝司著「絶対現場主義 Visual C#実践講座」では、前者の方法について、
以下のように書かれています。
http://www.amazon.co.jp/%E7%B5%B6%E5%AF%BE%E7%8F …
----------------------------
サブフォーム側では、「Owner」プロパティを呼び出し元画面の型でキャストすれば、
そのプロパティを「えへへ。参照し放題ですぜ」というわけだ。
さらに、フォームに乗せてあるコントロールのModifiersプロパティを
Publicなんぞにした日にゃあなた、こりゃタマリませんなあということになる。
いかがだろうか。実際問題、荒業も程があるのであって、決してこの方法を
選択してはならないぞ。
----------------------------
。。。
といいつつ、自分の趣味プログラムでは、
楽なので前者の方法ばかりを使っています。。。
いろいろと詳しくありがとうございます。
お礼を書いている時点でそのすべてを確かめているわけではありませんがとても参考になります。
いろいろな方法があって、その弊害というものは自分が書いているプログラムの中ではまだ
見つけることができていませんから、実体験しないと「理解する」のがなかなか難しいです。
私も趣味でC#をやっていますので現場のようなシビアな環境ではありませんが、紹介してくださった
本も確認してみたいと思います。
今回はわからないことに親切に回答してくださって助かりました。
おそらく、再び他の不明なことで質問すると思います。いちおう質問前にネットで調べてから質問していますが、理解が足りない点はご容赦ください。
どうもありがとうございました。
No.4
- 回答日時:
ANo.3です。
えーと、Form1はどのようにして表示しましたか?
「Form2のコード上で」
Form1 fm = new Form1();
とご自身で書かれていますよね。
ということは、"この新しい" Form1 は、当初の段階では
表示されていませんよね。
その後、Fomr1を、
fm.Show();
や
fm.ShowDialog();
で表示されたということでしょうか。
であるならば、その"新しいForm1"のtextBoxには、
表示前後に関わらず、
((TextBox)fm.Controls["textBox" + No.ToString()]).Text = "hoge";
で、値が入るはずですが、、、
。。。
ちょっと確認したいのですが、おっしゃっているForm1というのは、
本当に今作成たばかりのForm1(のインスタンス)である「fm」でしょうか。
もしかして、書かれているForm2のコードが実行される前から表示されている、
もともとあるForm1ということはないですか?
だとすると、新たに作成したfmに対していくら設定しても
意味がないですよね?
> この方法で値を取ることができましたが、
これで取った値というのは、コードで何も処理していなければ。
Form1の各textBoxに入っている初期値のはずです。
ああ…なんとなくおっしゃっていることがわかりました。
>もしかして、書かれているForm2のコードが実行される前から表示されている、
>もともとあるForm1ということはないですか?
すみませんそのとおりです。Form2表示前にある元のForm1のtextBox1に対して値を入力させたいのです。
そうするとForm1 fm = new Form1();というのはダメですよね…。
以下の方法でできるようになりましたが正しいでしょうか?
Form1:-------------------------
private void Form2_Open(object sender, EventArgs e){
Form2 fromItem = new Form2(this);
DialogResult deRet = fromItem.ShowDialog();
}
Form2:-------------------------
public partial class Form2 : Form
{
Form pFm;
public Form2(Form1 fm){
pFm = fm;
}
private void button_Click(object sender, EventArgs e){
int no = 1; //例として1とする
((TextBox)pFm.Controls["textBox" + no.ToString()]).Text = "hoge";
}
}
No.3
- 回答日時:
ANo2ですが訂正を。
Noのところ、No.ToString() の方が良いですね。
string result = ((TextBox)fm.Controls["textBox" + No.ToString()]).Text;
忘れてたので、念のため。
ありがとうございます。
string result = ((TextBox)fm.Controls["textBox" + No.ToString()]).Text;
この方法で値を取ることができましたが、逆にForm2からForm1のtextBoxに値を入れようと思って
((TextBox)fm.Controls["textBox" + No.ToString()]).Text = "hoge";
としましたがなぜか入力されません。
Form2が開いているときにForm1のtextBoxに値を入力するにはどのようにしたらよいのでしょうか?
textBoxのModifiersプロパティをPublicにしてみましたが、ウンともスンとも反応がないのです。
そもそも私の考え方が間違っていると思うのですが、どのように対応したらよいのでしょうか?
よろしくお願い致します。
No.1
- 回答日時:
フォームのControlsコレクションから取得すればいいのではないかと思います
// int nn にテキストボックスの何番目かを覚えておく
Control[] ctls = Controls.Find( "textBox" + nn.toString(), false );
if ( ctls.Length > 0 )
{
TextBox txt = (TextBox)ctls[0];
// ここにやりたい処理を記述
// txt.Text = "hoge"; など
}
といった具合で ・・・
この回答への補足
少し修正して
Form1 fm = new Form1();
int nn = 1; //例として1とする
Control[] ctls = fm.Controls.Find( "textBox" + nn.toString(), false );
if ( ctls.Length > 0 ){
TextBox txt = (TextBox)ctls[0];
txt.Text = "hoge";
MessageBox.Show("入力されました");
}
としましたらif文の中身はMessageBoxが表示されたので実行されたのですが、textBox1には"hoge"が入力されませんでした。
No3さんへのお礼と同じで、Form2が開いている状態ではForm1のコントロールには入力できないようなのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
C#でフォームのオブジェクト名を変数名で指定
C言語・C++・C#
-
C# Controls.Addで動的に配置したコントロールのRemoveについて
C言語・C++・C#
-
C#で動的に作ったtextboxを消す。
C言語・C++・C#
-
-
4
C# インスタンスの破棄
その他(プログラミング・Web制作)
-
5
Groupboxの配下のコントロール名を確認したい(その逆も有り)
Visual Basic(VBA)
-
6
テキストボックスの名前に変数をつける
Visual Basic(VBA)
-
7
コンボボックスでドロップダウンリストにしたときに・・・・
Visual Basic(VBA)
-
8
C# ログイン画面からメイン画面への画面遷移について
C言語・C++・C#
-
9
C#のループでtextboxに値を入れる方法
C言語・C++・C#
-
10
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
11
C#でButtonのフォーカス枠を消したいのですが
C言語・C++・C#
-
12
データベースのデータをTextBoxに入力された値で検索しDataGridViewに表示する方法
Visual Basic(VBA)
-
13
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
14
画面を強制的に再描画させる方法
C言語・C++・C#
-
15
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
16
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
-
17
配列を使わずに、変数名を動的にループで回したい
C言語・C++・C#
-
18
Labelコントロールに数字を代入する
C言語・C++・C#
-
19
C# 超初心者です。 this.Refresh();という文を使いたいです
C言語・C++・C#
-
20
C# Form上に配置されたコントロールに重なるように透過GIF(PNG)を表示したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Cのプログラムからアクセスでき...
-
大量のデータを読み込んで表示...
-
プログラミング言語でアプリや...
-
c++の勉強方法を教えてくださ...
-
gccを行ってもexeファイルが生...
-
C言語って古いですか?
-
Windows Formアプリからコンソ...
-
C言語について。
-
いまc言語を独学で勉強している...
-
c言語
-
C# でソフト開発をした事のある...
-
ホワイトハッカーを目指そうか...
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
これて逆じゃないですか?
-
あんまり考えたくないけど
-
C言語について。
-
C言語について。
-
だれがとけるの?
-
C言語 配列と関数の練習問題
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
VB6.0-整数と余りを求める
-
数字の位ごとの値を表示するプ...
-
足して100になるような乱数のア...
-
DWORDって
-
VBAの定数の使い方で、計算値を...
-
世界のナベアツ
-
1つ前の値を変数に保存する方法
-
ラジオボタンの値の取得につい...
-
フリーランタイマーの時間差分...
-
C#で動的にコントロールを取得...
-
UWSCのcallについて
-
DataGridView 複数行同時変更...
-
10進数をアスキーコードに変換
-
4択問題のプログラムでランダム...
-
データ構造のmapとは?
-
VBAで配列のNULL判定
-
VBAで72時間タイマーがオーバー...
おすすめ情報