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

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

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

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

Visual Studio

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

3010閲覧

C#で親子フォーム同時開きで親画面クリックで親string値を子Labelに表示(更新)

dendenmushi

総合スコア98

C#

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

Visual Studio

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2018/08/25 16:59

編集2018/08/26 05:17

前提・実現したいこと

visual studio 2017
windowsフォームでForm1(親画面)とForm2(子画面)が両方開いている状態で、Form1のbutton1をクリックすることで、Form1クリックメソッドによって準備されたstringがForm2に渡り、Form2のLabel1に表示(更新)される実装をしたい。

Form1に記述したコード

C#

1 private void Form1_Load(object sender, EventArgs e) 2 { 3 4 } 5 6 private void button3_Click(object sender, EventArgs e) 7 { 8 9 Form2 f = new Form2 10 { 11 12 //子画面のプロパティに値をセットする 13 strParam = "親画面からセットした値" 14 }; 15 16 f.ShowDialog(); 17 }

Form2に記述したコード

C#

1 //親画面からアクセスできるプロパティを作る---- 2 private String _strParam; 3 4 public String strParam 5 { 6 get 7 { 8 return _strParam; 9 } 10 set 11 { 12 _strParam = value; 13 } 14 } 15 16 public Form2() 17 { 18 InitializeComponent(); 19 } 20 21 private void Form2_Load(object sender, EventArgs e) 22 { 23 this.label1.Text = strParam; 24 }

発生している問題

この記述ですとForm1のボタンをクリックした際に、Form2が再び開かれて、Form2のLabel1に記載されている状態でした。もともと開いているForm2のLabel1を更新表示したいです。

試したこと

Form2

C#

1 2     private Form1 fm1; 3 4 // コンストラクタをオーバーロードする 5 public Form2(Form1 fm) 6 { 7 // 8 // Windows フォーム デザイナ サポートに必要です。 9 // 10 InitializeComponent(); 11 12 // メインフォーム 13 fm1 = fm; 14 15 } 16 private void Form2_Load(object sender, EventArgs e) 17 { 18 this.label1.Text = fm1.~?? 19 20 21 } 22

Form1の情報を取得できると思ったのですが、Form1で定義してもなかなかうまくいきません。
fm1からForm1のbuttonメソッドを呼び込もうとしても結果string値の変数を書けませんでした(赤波線)。サイトなど参考にしているのですが、こんがらがってしまいました。表示するだけなのですが、どなたかアドバイス頂けないでしょうか。

この他試したこと

C#

1 public void Form1_Load(object sender, EventArgs e) 2 { 3 Form1 form1 = new Form1(); 4 form1.aaa2 = "bbb"; 5 } 6 7     public string aaa2 { get; private set; }

補足情報(FW/ツールのバージョンなど)

win10
visual studio 2017 Community

###アドバイス頂いて行ったこと

Form2

C#

1 public string Y { get; internal set; }//←追加 2 public string X { get; internal set; }//←追加 3 4 public Form2() 5 { 6 InitializeComponent(); 7 }

Form1

C#

1 private void button2_Click(object sender, EventArgs e) 2 { 3 //Form2 form = new Form2(); 4 //form.Show(); 5 6 // クラスのインスタンス化とプロパティの設定(従来の書き方) 7 Form2 form = new Form2(); 8 form.X = "1"; 9 form.Y = "2"; 10 11 } 12 13 private void button3_Click(object sender, EventArgs e) 14 { 15 Form2.X = "3";//←オブジェクト参照が必要ですエラー 16       form.X = "3";//←Xの定義が定まっていない 17 18 } 19

###アドバイス受けて行ったこと2

Form1
C#

public void Form1_Load(object sender, EventArgs e) { // Form1 りロード時に、Form2を作成 form2 = new Form2(); form2.X = "test"; form2.Show(); } private void button3_Click(object sender, EventArgs e) { // Label1 が publicである事 form2.X = "...."; form2.Refresh(); }

Form2

C#

1 public string Y { get; internal set; } 2 public string X { get; internal set; } 3 4 5 public Form2() 6 { 7 InitializeComponent(); 8 }

デバッグ実行したところFrom1とForm2が同時に現れました。しかしForm2のLabelはLabel1と表示されたままでtestと初期が表示されておらず、かつButton3を押しても変化がありませんでした。

###トライ③

結果的にForm2側にsetされた値をもとにlabel1.Textに代入して反映させるボタンを作りました。ありがとうございました。

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

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

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

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

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

guest

回答2

0

すでに表示しているインスタンスのプロパティに設定しましょう
インスタンスをnew すれば新たにForm2ができてしまいます

投稿2018/08/25 21:55

編集2018/08/25 22:25
y_waiwai

総合スコア87715

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

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

dendenmushi

2018/08/26 01:38

ありがとうございます。今インスタンスにプロパティ設定奮闘中です…。
dendenmushi

2018/08/26 05:18

解決しました。ありがとうございました。
guest

0

ベストアンサー

Form1 の中の button1のクリックでのコード (button3_Click となっていますが、 button1 ですね?)

button3_Click(
Form2 f = new Form2

ここで、新規に、Form2を作成しています。従って、

Form1のボタンをクリックした際に、Form2が再び開かれて

となります。 Form1を開く際に、Form2を作成するのが簡単かと思います。

C#

1// クラスメンバして form2を持つ 2 Form2 form2; 3// Form1 りロード時に、Form2を作成 4 private void Form1_Load(object sender, EventArgs e) 5 { 6 // .... 7 form2 = new Form2(); 8 // .... 9 } 10 private void button3_Click(object sender, EventArgs e) 11 { 12 form2.Label1.Text = "...."; // Label1 が publicである事 13 // or 14 form2.SetLabel1("...."); // Lable1 に文字列を設定するメソッド 15 }

簡単には、こんなものでしょうか。上では直接、書きましたが、Label1 に文字列を設定するメソッド(ex. SetLabel1()) を用意して呼び出す方が、後々、使い易いです。

なお、質問文の記述ですが、Form1 と Form2の区別がよく分からなかったで、こちらで適当に解釈しました。

投稿2018/08/26 01:18

pepperleaf

総合スコア6383

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

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

dendenmushi

2018/08/26 01:43 編集

回答ありがとうございます。記述奮闘しています。今pepperleafさんの方法確認しています。
dendenmushi

2018/08/26 02:09

画面が同時に現れました。しかし初期値のtestが表示されず、Button3を押しても....に変化がありませんでした。どこか取り違えておりますでしょうか。
dendenmushi

2018/08/26 03:12

public void Form2_Load(object sender, EventArgs e) { label1.Text = X; } Form2_Loadにlabel1.Text =X;を記載したら初期値testだけは出るようになりました。ありがとうございます。
pepperleaf

2018/08/26 04:01

Form2 のコードで、 Xに値がセットされたら、 label1.Text = X; となる仕組みが必要です。 Xがプロパティ定義みたいなので、 set の中に含めてはどうでしょう。 あと、別のところでもアドバイスをもらっているのでしょうか? C#(だけでもないですが)は、一つの事をするのに方法がいくつもあります。混ぜるとうまくいかない事も多いです。ご注意を。
dendenmushi

2018/08/26 04:44 編集

すいません。setの中に含めるというのはどういったことでしょうか。いくつも考え中のコードが混在していて混乱中でした。X Y のget setがperperleafさんの方法で必要かどうかもわからなくなってます…。get setが汎用性があるのであればそちらで実践していきます。
dendenmushi

2018/08/26 05:18

label1.Textの仕組みをForm2側にボタンによって作動するように考えれました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問