質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

4回答

923閲覧

他のクラスでshowされたFormのテキストボックスにアクセスする方法

harapeko_KY

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2022/06/14 04:19

Windows Form ApplicationでForm1のボタンをクリックでForm2をshowさせ、そのForm2にあるテキストボックスにForm3からアクセスしたいのですがどのようにすればいいのでしょうか。

C#

1namespace WindowsFormsApp1 2{ 3 public partial class Form1 : Form 4 { 5 public Form2 frm2app; 6 public Form1() 7 { 8 InitializeComponent(); 9 10 } 11 private void button1_Click(object sender, EventArgs e) 12 { 13 frm2app = new Form2(); 14 frm2app.Show(); 15 } 16 } 17} 18 19namespace WindowsFormsApp1 20{ 21 public partial class Form2 : Form 22 { 23 public Form3 frm3app; 24 public Form2() 25 { 26 InitializeComponent(); 27 } 28 29 private void Form2_Load(object sender, EventArgs e) 30 { 31 frm3app = new Form3(); 32 frm3app.Show(); 33 } 34 } 35} 36 37namespace WindowsFormsApp1 38{ 39 public partial class Form3 : Form 40 { 41 public Form3() 42 { 43 InitializeComponent(); 44 } 45 46 private void button1_Click(object sender, EventArgs e) 47 { 48 frm2app.textBox1.Text = "1234";  //ここでテキストボックスを操作したい 49 } 50 } 51}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/15 01:34

質問者さん、無言ですが、回答がいくつかついているのでそれらに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
guest

回答4

0

Form2 のインスタンスが1つしかないという前提であれば、Application.OpenForms コレクションから Form2 のインスタンスを得ることが出来ます。

C#

1Form2 f = Application.OpenForms.OfType<Form2>().FirstOrDefault(); 2if (f != null) { 3 var tbox = f.Controls.Find("textBox1", true); 4 if (tbox.Length > 0) { 5 tbox[0].Text = "1234"; 6 } 7}

そうでない場合、私ならインスタンスを特定するための何らかの情報を持たせると思います。

投稿2022/06/14 06:55

KOZ6.0

総合スコア2622

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「Form2 のテキストボックスにアクセスする」ことで実現したい事柄(その処理の意味)も不明であるし,そもそも提示されているコードの形は実際のプログラムのミニマム版というわけでもないらしい(←他回答についてコメントより)ので,

  • やりたいことを実現するための何かしらの手段を用意する
  • Form3 のインスタンスからその手段にアクセスできるようにする

としか.

例えば「やりたいことをやってくれる奴」というのを用意して,Form3にそれへの参照を教えておけばよい.

投稿2022/06/14 05:22

fana

総合スコア11634

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のようにしてはいかがですか?

(1) Form2 に frm2app.textBox1.Text にアクセスできるパブリックプロパティを追加する。

public string Frm2appTextboxTest { set { this.textBox1.Text = value; } get { return this.textBox1.Text; } }

(2) Form3 に Form2 への参照を引数に取るコンストラクタとフィールドを追加する。

private Form2 _form2; public Form3(Form2 form2) { InitializeComponent(); _form2 = form2; }

(3) Form2 で Form3 を初期化する際は (2) で作ったコンストラクタを使う。

private void Form2_Load(object sender, EventArgs e) { frm3app = new Form3(this); frm3app.Show(); }

(4) Form3 から (1) で作ったパブリックプロパティにアクセスする

private void button1_Click(object sender, EventArgs e) { _from2.Frm2appTextboxTest = "1234"; }

投稿2022/06/14 05:17

編集2022/06/14 05:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そのForm2のインスタンスはForm1が持ってるので、そのテキストボックスをForm1のプロパティかなんかで出してやれば他からアクセスできます

投稿2022/06/14 04:22

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/06/14 04:52 編集

私が低評価したのではありませんが、テキストボックスを外に出すのであれば Modifier を設定するだけで十分です。そして普通はテキストにしかアクセスしないのにテキストボックスごと外に出すことはしません。 また、form3 は form1 のインスタンスを持っていません。 間違いとまでは言えないが、ひどく稚拙で、参考にすべき回答ではありません。
fana

2022/06/14 04:54

> Form2にあるテキストボックスにForm3からアクセスしたい ということで, Form2 と Form3 の間での話ですから,とりあえず Form1 を絡ませなくてもよいのではないでしょうか. (コードを見ると,Form2 が Form3 を持っている形になっている様子故)
harapeko_KY

2022/06/14 05:00

質問するためだけに作ったものなのでForm2 が Form3を持っているのですが実装したいプログラムはそうなっていません。 紛らわしくてすみません。
退会済みユーザー

退会済みユーザー

2022/06/14 05:23

低評価は私です。回答になっていないので。
y_waiwai

2022/06/14 05:48

まあ、なんにせよ、インスタンスに対してアクセスする必要があるので、いかにそのインスタンスを外に出すか、っておはなしとなります んで、 > public Form2 frm2app; とpublicになってるなら、 form1.frm2app.textBox1.Text = "1234"; でもアクセスできます。が、これでは筋が悪い、とツッコまれますねw
Zuishin

2022/06/14 06:19

> インスタンスに対してアクセスする必要があるので、 明示的なアクセスの必要があるとは限りません。 質問を見る限り、必要なのはテキストを変更することなので、データバインディングやイベントや DI やメッセンジャーや IObservable などの方法があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問