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

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

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

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

Q&A

解決済

4回答

1962閲覧

フォーム間の値が引き渡せない(nullへ変化する)

superhiro

総合スコア7

C#

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

0グッド

0クリップ

投稿2020/01/24 05:36

前提・実現したいこと

form1のbutton5を押下すると、form17のキャプチャ画面が立ち上がり、form17のbutton1を押下すると、bmpを保存しファイルパスをform1のtextBox1へ返却する動きを実装しようと思っています。

発生している問題・エラーメッセージ

エラーは発生していませんが、form17からform1へファイルパスが渡ってくれません。デバックで追いかけるとform17の処理が終わるタイミングでnullに変わってしまいます。原因は何でしょうか。

該当のソースコード

C#

1//フォーム1に記載のプログラム 2 private String _fpath; 3 public String fPath 4 { 5 get { return _fpath; } 6 set { _fpath = value; } 7 } 8 9 private void button5_Click(object sender, EventArgs e) 10 { 11 12 Form17 form17 = new Form17(); 13 if (form17.ShowDialog() == DialogResult.OK) 14 { 15 this.textBox1.Text = this.fPath; 16 webBrowser1.Navigate(this.textBox1.Text); 17 } 18 } 19 20//フォーム17のプラグラム 21 public void button1_Click_1(object sender, EventArgs e) 22 { 23 24 // 現在のフレームをビットマップに保存 25 var bmp = videoSourcePlayer1.GetCurrentVideoFrame(); 26 if(bmp!= null) 27 { 28 String fpath = @"C:\Users\owner\Pictures\"+DateTime.Now.Ticks+".bmp"; 29 bmp.Save(fpath); 30 Form1 form1 = new Form1(); 31 form1.fPath = fpath; 32 this.DialogResult = DialogResult.OK; 33 this.Close(); 34 } 35 else 36 { 37 return; 38 } 39 40 }

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

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

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

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

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

guest

回答4

0

皆さんの仰る通り、new Form17();を行っているForm1と、Form17のインスタンス内で行っているnew Form1();とは別のインスタンスのため、その通りの結果となります。

一つの方法として、Form1とForm17の従属関係を使うというのも手です。
Form1の中で、form17.ShowDialog();を行う代わりに

C#

1 form17.ShowDialog(this);

とすると、このダイアログは自分自身(つまりForm1)を親としてモーダル表示しますが、この場合、form17側のインスタンスで、呼び出し元(つまりForm1)をOwnerプロパティで取得できます。

C#

1 Form1 form1 = (Form1)this.Owner; 2 form1.fPath = fpath;

投稿2020/01/24 06:57

編集2020/01/24 07:27
kenshirou

総合スコア772

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

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

0

YAmaGNZ様のご回答にあるように新しくForm17側でForm1をnewしているため、
元のForm1とは別物になります。
ですので、Form17に元のForm1オブジェクトを渡すことで解決できるかと思います。
上記説明でイメージできますでしょうか?

// Form1 Form17 form17 = new Form17(); form17.SetForm1(this); form17.ShowDialog();
// Form17 private Form1 _form1 = null; public void SetForm1(Form1 p_form1) { this._form1 = p_form1; }

投稿2020/01/24 05:59

510vivienne

総合スコア40

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

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

0

ベストアンサー

こういう場合は、Form17側に変数なりプロパティなりを定義し、form1から読む、ということをしましょう

投稿2020/01/24 05:50

y_waiwai

総合スコア87784

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

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

superhiro

2020/01/24 06:39

Form17にプロパティを定義して、Form1から見てForm17をsubFormとすることで、引き渡すことができました。YAmaGNZ含めて、ご対応ありがとうございました。
guest

0

クラスやオブジェクト、インスタンスについて学習してください。

C#

1Form1 form1 = new Form1();

これで現在表示しているForm1とは別の新しいForm1が作成されます。
その新しく作成されたForm1に値をセットしているので、現在表示しているForm1は変化しません。

投稿2020/01/24 05:42

YAmaGNZ

総合スコア10288

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問