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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

2回答

3178閲覧

Windows Form サブフォームからメインフォームに値を渡す方法

_KEY

総合スコア1

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/08/03 05:48

編集2021/08/03 07:35

WindowsForm(C#)について質問です。

サブフォームからメインフォームに値を渡すやり方を調べていたところ、サブフォームからメインフォームへ情報を受け渡す場合、サブフォームはメインフォームのインスタンスを保持していない為、メインフォームのインスタンスをサブフォームの変数に渡さなければならないという記事を見つけたのですが、staticでメインフォームの変数を静的にしてもサブフォームから値を渡すことができたので、後者のやりかたでやっても問題ないのでしょうか?

C#

1public partial class Form1 : Form 2{ 3 private static Boolean a; 4 5 private void button1_Click(object sender, EventArgs e) 6 { 7 Form2 form2 = new Form2(); 8 9 if (!a) 10 { 11 form2.Show(); 12 } 13 a = true; 14 } 15 16 public Boolean A 17 { 18 get { return a; } 19 set { a = value; } 20 } 21 22 23 24public partial class Form2 : Form 25{ 26 private void button1_Click(object sender, EventArgs e) 27 { 28 Form1 form1 = new Form1(); 29 form1.A = false; 30 } 31

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

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

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

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

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

Zuishin

2021/08/03 06:07

その記事の方法も良いとは言えないけど、それで問題が起きなきゃ問題ないんじゃないですか?
退会済みユーザー

退会済みユーザー

2021/08/03 07:05

> staticでメインフォームの変数を静的にしてもサブフォームから値を渡すことができたので その簡単なサンプルコードを質問欄に書くと、こうした方が良いとか、こういう方法もあるとかのレスがもらえるかもしれません。
退会済みユーザー

退会済みユーザー

2021/08/03 07:47

Form2 に Form1 への参照を保持する変数と、Form を引数に取るコンストラクタを追加して、Form1 で Form2 を new する際、Form1 の参照を渡してはいかがですか?
_KEY

2021/08/03 08:08

private static Boolean a; ここでstaticにすれば一応参照はできているのですが、やはりnewする際にインスタンスを渡したほうがいいのでしょうか?
gentaro

2021/08/03 08:11 編集

「後者のやりかたでやっても問題ないのでしょうか?」というのはどういう趣旨の質問? あなたの用途でそれでテストして問題ないなら他人がどうこう言えるものじゃないけども、テストしないつもり? それとも問題のあるケースが既に想定されている? あなた自身が問題を把握していないのに漠然と質問するのはこのサイトの趣旨に反するけども。 https://teratail.com/help/question-tips https://teratail.com/help/avoid-asking
_KEY

2021/08/03 08:26

テストした結果問題がなかったのですが、ネットで調べてもインスタンスを渡すやり方しか出てこなかった為、C#初心者なので本当にこの実装の仕方で理解していいのか質問させていただきました。初投稿ということもありガイドラインに違反した質問だとは思いませんでした。以後気を付けます。
退会済みユーザー

退会済みユーザー

2021/08/03 08:31

設計がいいか悪いかは、自身が判断するべき事だと思います。 デザインパターン系の書籍や記事を読まれるのがよいのではないでしょうか。
gentaro

2021/08/03 12:11

このサイトでは初心者である(ので質問の不備を大目に見て欲しい)旨を伝えたいなら質問に初心者マークを付ける事ができるようになっており、逆にそれが無いのに頓珍漢な質問をしてると、何を言ってるんだ?という反応なるのはある意味当然なんで、せめてサイトの使い方ぐらいは調べてから投稿したほうが良い。 ベストプラクティスを質問したいのならそう書くべきだし、「誰にとってのどんな問題なのか」の基準を示さず「問題ないのでしょうか?」と質問されても回答は不可能。
gentaro

2021/08/03 12:18

というかまぁ、あなたが本質的に必要としているのは「先生」なんだろう。 質問内容が一問一答で答えられる範囲を超えてる。 「○○の場合はこうで~」など、回答者が先回りして手取り足取り教えてもらえると思わない方が良い。 ここは技術的な問題に直面した際にフラットな立場でQ&Aをする場であって、学校の代わりじゃない。 そういう先生役が欲しいなら、職場の同僚や教育担当者(学生なら教師や友人)に頼んだり、技術者系のコミュニティ(フォーラムやDiscordグループ等)に参加したほうが良い。
guest

回答2

0

サブフォームはメインフォームのインスタンスを保持していない為、メインフォームのインスタンスをサブフォームの変数に渡さなければならないという記事...

メインをサブから直接いじくるというのは1つのやり方だけども,
別に,その形じゃなくてもいい.

「サブからメインに値を渡すための何らかの手段」があればよい.
例えば,「サブ→何か→メイン」のように,間に何かを経由しようが,目的が果たせれば何でもいい.


提示コードに関しては(staticでやることの良し悪しは別として),

プロパティを介してstaticメンバをいじくるためだけに new Form1(); とかするんじゃなくて,
そのプロパティ自体をstaticにすればよいのでは.

//こいつをstaticに public static Boolean A { get { return a; } set { a = value; } }

投稿2021/08/03 08:14

fana

総合スコア11996

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

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

0

ベストアンサー

不必要なインスタンスを作るのがよくないかと思います。
例えばForm2を生成して表示する部分は下記のように必要な時にインスタンスを作成すべきかと

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 if (!a) 4 { 5 Form2 form2 = new Form2(); 6 form2.Show(); 7 } 8 a = true; 9 } 10

また、staticにするのも静的なもの考え方からするとよくないかと思います。

方法論としては
0. Form2にForm1のインスタンスを渡してForm1のプロパティにアクセスする
0. Form2にデータを受け渡したいタイミングで発生するイベントを作り、Form1側でそのイベント時にForm2のプロパティ等からデータを取り出す。

私は2の方法のほうがForm2がForm1に依存しなくなるので好みです。

質問の趣旨とは少し外れますが、提示されたソースはForm2の表示制御を行いたいだけに見えます。
Form1とForm2の関係性は分からないので的外れかもしれませんが

C#

1public partial class Form1 : Form 2{ 3 private void button1_Click(object sender, EventArgs e) 4 { 5 Form2 form2 = new Form2(); 6 form2.ShowDialog(); 7 } 8} 9 10 11public partial class Form2 : Form 12{ 13 private void button1_Click(object sender, EventArgs e) 14 { 15 this.Close(); 16 } 17}

これで終わる話だったりしませんか?

投稿2021/08/03 22:26

YAmaGNZ

総合スコア10489

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問