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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3817閲覧

孫画面から親画面のメソッドを呼び出したい

cvdykhm1030

総合スコア3

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/08/21 08:20

お世話になります。VB.NET初心者です。
Visual Studio 2017で簡易なWindowsフォームアプリを作っています。

機能概要

簡単な画面遷移は以下です。

(親)[検索Form]→(子)[編集Form]→(孫)[結果Form]

1)検索画面で「検索ボタン」を押下すると、結果を一覧表示する。
2)一覧から対象を選択して「編集ボタン」を押下すると、編集画面をモーダル表示。
3)編集画面で「更新ボタン」を押下すると、結果画面をモーダル表示。

やりたいこと

 1)[結果Form]を閉じた際に、[編集Form]も閉じる。
2)[検索Form]で自動的に再検索して、編集後の状態を一覧に表示したい。

ソースコード

ソースコードは以下の通り実装しています。

(親)検索Form.vb

'親Formのインスタンス作成 Private Property _検索FormInstance As 検索Form Public Property 検索FormInstance() As 検索Form Get Return _検索FormInstance End Get Set(ByVal value As 検索Form) _検索FormInstance = value End Set End Property (略) '画面ロード Private Sub 検索Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load   (略)   'インスタンスに設定 検索FormInstance = Me   (略) End Sub '検索ボタン押下(←孫画面から起動したいメソッド**) Public Sub btn_search_Click(sender As Object, e As EventArgs) Handles btn_search.Click (略) End Sub '編集ボタン押下 Private Sub btn_edit_Click(sender As Object, e As EventArgs) Handles btn_edit.Click   (略)   Dim f = New 編集Form f.ShowDialog(Me) f.Dispose()   (略) End Sub

(子)編集Form.vb

'更新ボタン押下 Private Sub btn_update_Click(sender As Object, e As EventArgs) Handles btn_update.Click   (略)   Dim f = 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

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

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

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

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

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

YAmaGNZ

2020/08/21 08:34

検索Formはどのように生成しているのでしょうか?
cvdykhm1030

2020/08/21 08:47

画面の立ち上げ方についてでしょうか。 実は検索画面の前に、トップ画面があり、その画面から    Dim f As New 検索Form   f.Show()    Me.Close() で表示しています。 (見当違いな解答であれば申し訳ございません)
guest

回答1

0

ベストアンサー

結果Formでの

VBNET

1検索Form.検索FormInstance.btn_search_Click(sender, e) '←★

で見ている検索FormMy.MyProject.MyFormsに自動で宣言される検索Formプロパティを参照しています。

VBNET

1Private Sub btn検索_Click(sender As Object, e As EventArgs) Handles btn検索.Click 2 検索Form.ShowDialog(Me) 3 検索Form.Dispose() 4End Sub

という形で呼び出した場合、My.MyProject.MyForms.検索Formからインスタンスを持ってくる(生成されていない場合は生成される)ので結果Formでの参照先が同じで検索Form.検索FormInstanceもセットされています。

しかし

VBNET

1Private Sub btn検索_Click(sender As Object, e As EventArgs) Handles btn検索.Click 2 Dim f As New 検索Form 3  f.Show() 4  Me.Close() 5End Sub

このように呼び出した場合はfにセットした検索Formのインスタンスと**検索Form.検索FormInstanceと参照した時に自動で生成される検索Formのインスタンス**が別物となってしまいます。
fにセットした検索Formのインスタンスのほうは表示されているのでLoadイベントが発生し、検索FormInstanceプロパティに値はセットされています。
しかし、My.MyProject.MyForms.検索FormのほうはNewされただけで表示されていないので検索FormInstanceプロパティに値はセットされておらずNothingのままとなっています。

エラーが発生する原因としては以上になります。

ではどのようにしてエラーを回避するかですが、方法は
0. 表示する時もMy.MyProject.MyForms.検索Formを使うようにする
0. Private _検索FormInstance As 検索FormをSharedで宣言して、どのインスタンスから見ても一意の値とする
0. 検索Formのインスタンスを格納する変数をグローバル変数として定義して、みんなそのインスタンスを使用する
等いろいろあるかと思います。

投稿2020/08/21 09:06

YAmaGNZ

総合スコア10251

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

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

cvdykhm1030

2020/08/21 12:27

YAmaGNZ様 非常に分かりやすいご回答ありがとうございます。 ご教示いただいた3つの解決策をWebサイトで調べながら試してみましたが、 全て想定通りの挙動となりました。 恥ずかしながら、Sharedの使い方を知りませんでしたので、大変勉強になりました。 今後機会ございましたら、また宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問