DOBON.NET どぼん!のVB道掲示板(プログラム)過去ログ

サブフォームからのメインフォームへの処理

●詳しい症状等:
はじめまして。いつも参考にさせていただいております。
VB.NET初心者の私にとっても大変わかりやすくとても有難いです。

初歩的な質問なのですが、
いまメインフォーム「Form1」とサブフォーム「Form2」を作成し、
「Form1」には「TextBox1」と「Button1」があり、
「Form2」には「Button2」があります。

下記のソースで「Form1」の「Button1」をクリックして
「Form2」を表示しました。

◆「Form1」のソース
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim f2 As New Form2()
f2.Show()
End Sub

このあと、「Form2」の「Button2」をクリックしたら
「Form1」の「TextBox1」に"あいうえお"と表示させたいのですが

◆「Form2」のソース
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim f1 As New Form1()
f1.Show()
f1.TextBox1.Text = "あいうえお"
End Sub

このようにすると、新しい「Form1」が作成されてしまいます。

●どうしたいか:
新しい「Form1」が作成されず、
初めにあった「Form1」の「TextBox1」に"あいうえお"と表示させたい場合には
どのようにすればよろしいでしょうか?

●あなたが試した解決(対策)法:
Dim f1 As New Form1()

Dim f1 As Form1
にしたらいいのかなと思ったんですが、実行時にエラーで
「オブジェクト参照がオブジェクト インスタンスに設定されていません。」
となってしまいます。

どうか、ご教示お願い致します。
まず、f2 をprivate で宣言してみましょう。Form1クラスの先頭に近い部分(フォームデザイナによって自動的に云々という直前ぐらいです)に

Private f2 As Form2

という記述を書きます。そして、Dim していた部分を

f2 = New Form2()

に書き換えます。これで、Form2 が Form1 からいつでも参照できるようになっています。新しくオープンされた Form2 の値を変える時は、f2.*** という値を操作できます。つまり f2 は Form2 のインスタンスへの参照になっています。

これの逆を Form2 からやればよいでしょう。Form2に今度は

Private myForm1 as Form1

というような記述を追加します。そして、Form2 にプロパティを追加します。

Property MainForm As Form1

と書いて Enter を押すと、自動的に Get / Set のブロックが作られるので Get には return myForm1、 Set には myForm1 = value という記述を書きます。

そして、Form2 を new して show していた部分で、show の直前に

f2.MainForm = Me

とすれば、f2 からみると myForm1 が常に、自分を開いたフォームへの参照ということになります。myForm1.*** という操作が可能になります。Button2_Click の記述は単に

myForm1.TextBox1.Text =”あいうえお”

とすればOKです。
こんなに早く回答を頂けて、ありがとうございます♪

早速ご教示の通りやってみましたら、うまくいきました。
これらのコードが具体的にどのような処理を行っているのかは
まだイメージがつかみにくいですが、これから勉強していきたいと思います。

大変助かりました。ありがとうございました♪

DOBON.NET | プログラミング道 | プログラミング掲示板