質問: New 結果Form f.ShowDialog(Me) f.Dispose() (略) End Sub ``` (孫)編集Form.vb ``` 'OKボタン押下 Private Sub btn_ok_Click(sender As Object, e As EventArgs) Handles btn_ok.Click Me.Owner.Close() Me.Close() 検索Form.検索FormInstance.btn_search_Click(sender, e) ←★ End Sub ``` ### 問題点 「やりたいこと」の2)の実装の際に 上記の★のコードで、以下のエラーが発生します。 ``` オブジェクト参照がオブジェクト インスタンスに設定されていません。 ``` 参照したい親フォームのインスタンスがNullとなっています。 親フォームのロード時に設定しているので、問題ない認識でした。 初歩的な質問で大変恐縮ですが、どうぞ解決策をご教示いただきますよう、宜しくお願いいたします。 ### 参考 この機能は、下記を参考にして実装しました。 【dobon.net 別のフォームのデータを取得、設定する】 http://dobon.net/vb/dotnet/form/accessanotherformdata.html ### 環境 Visual Studio 2017 .NetFramework 4.6.1
回答: 結果Formでの ``` 検索Form.検索FormInstance.btn_search_Click(sender, e) '←★ ``` で見ている`検索Form`は`My.MyProject.MyForms`に自動で宣言される`検索Formプロパティ`を参照しています。 ``` Private Sub btn検索_Click(sender As Object, e As EventArgs) Handles btn検索.Click 検索Form.ShowDialog(Me) 検索Form.Dispose() End Sub ``` という形で呼び出した場合、`My.MyProject.MyForms.検索Form`からインスタンスを持ってくる(生成されていない場合は生成される)ので`結果Form`での参照先が同じで`検索Form.検索FormInstance`もセットされています。 しかし ``` Private Sub btn検索_Click(sender As Object, e As EventArgs) Handles btn検索.Click Dim f As New 検索Form f.Show() Me.Close() End Sub ``` このように呼び出した場合は**fにセットした検索Formのインスタンス**と**`検索Form.検索FormInstance`と参照した時に自動で生成される検索Formのインスタンス**が別物となってしまいます。 fにセットした検索Formのインスタンスのほうは表示されているのでLoadイベントが発生し、検索FormInstanceプロパティに値はセットされています。 しかし、My.MyProject.MyForms.検索FormのほうはNewされただけで表示されていないので検索FormInstanceプロパティに値はセットされておらずNothingのままとなっています。 エラーが発生する原因としては以上になります。 ではどのようにしてエラーを回避するかですが、方法は 1. 表示する時も`My.MyProject.MyForms.検索Form`を使うようにする 2. `Private _検索FormInstance As 検索Form`をSharedで宣言して、どのインスタンスから見ても一意の値とする 3. 検索Formのインスタンスを格納する変数をグローバル変数として定義して、みんなそのインスタンスを使用する 等いろいろあるかと思います。