画像ファイル
画像ファイル VB.NET Form1、Form2の相互参照
VB.NET C#全般
1羊の皮を着た狼 VB.NET
2Form1、Form2の相互参照
3Form1、Form2の相互参照 2
4VB.NET C# データ型の基本
5VB.NET C# 文字列
6VB.NET タイマー精度
7BackgroundWorkerの魅力1..
8BackgroundWorkerの魅力2..
9VB6のタイマー
10コントロールの配列をインデクサ..
11コントロールの配列はジェネリク..
12インデクサ(C#、VB.NET)
13インデクサでBit操作
14Unicode 入門
15デリゲート入門
16マルチスレッド入門
17イベント入門
18デリゲートとイベント
18インターフェースの基本

RichTextBox関係
1RichTextBoxの不思議
2テキスト色付け高速化計画
3VB.NET RichTextBox1
4VB.NET RichTextBox 2

RS-232C関係
1RS-232Cの基礎
2RS-232Cの何が変わった..
3SerialPortクラス
4Unicode(ユニコード)の壁
5マルチスレッドの壁
6RS-232C サンプルコード
7RS-232CのHEXモニタ
8RS-232C 送信モジュール
9RS-232Cのループテスト
10RS-232Cのピンチェンジ..

Socket通信
1C#、VB2005 でSocket通信
2サーバー 複数接続

プロセス間通信
1プロセス間通信(送信側)
2プロセス間通信(受信側)


質問、意見はこちらに
画像ファイル

VB.NET Form1、Form2の相互参照2
Form1でForm2を起動して、Form2からForm1をForm1からForm2を参照する方法を 紹介します。

仕様
・Form1でForm2を起動する、Form2が既に起動している場合は、フォーカスを当てる。
・Form2からForm1のテキストボックスに書き込みをする。
・Form1からForm2のテキストボックスに書き込みをする。
・Form2が閉じられても再度Form1から起動可能なこと。
・Form1が閉じられるとForm2も閉じられること。
外観
画像ファイル;

VB.NET Form1のコード
Public Class Form1
Dim F2 As Form2
'F2が起動していなければ起動し、起動していればフォーカスを当てる
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles ButForm2.Click
If (F2 Is Nothing) OrElse (F2.IsDisposed) Then
'Form2のインスタンスF2を作って表示する
F2 = New Form2(Me)
F2.Visible = True
Else
'フォーカスを当てる
F2.Focus()
End If
End Sub
'Form2のテキストボックスに書き込む
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button2.Click
'F2が起動されていて、Disposeされていなければ
If F2 IsNot Nothing AndAlso Not F2.IsDisposed Then
F2.TextBox2.Text = TextBox1.Text
End If
End Sub
End Class
さてForm2を起動するForm1側のコードであるが、注意点が幾つかあります。
F2はForm2のインスタンスで・F2 = New Form2(Me)で作成されることは既にご存知であると思われる。
引数Meに関しては追い追い説明しよう。
難しいのは、Form2が一旦起動されて、Form2側で閉じられ再度起動する時のコードです。
フォームを閉じると言うことは、フォームの右上のでフォームを閉じると言うことである、念のために。
フォームが閉じられると、Disposeが呼び出されF2は破棄されますが、Form1側では参照がまだ
残っています、そこで既にF2がDisposeされたか否かを以下の行のOrElse以降で見ています。
・If F2 Is Nothing OrElse F2.IsDisposed = True Then
F2 Is NothingはF2が一度も起動されていない時はTrueになり、F2.IsDisposedはF2が破棄された 場合にTrueになる。
すなわちF2が一度も作成されていないか又は破棄された場合は、新しいF2を作成しているのである。
又F2のテキストボックスに書き込む場合も同様のチェックをしている。
次に
・ F2 = New Form2(Me) ですが一見あまり見たことが無いMeが引数に付いています、
これがForm1のインスタンスMeをを引数にしてF2に渡しているところである。
どのように渡るかは以下のForm2のコードをご覧下頂きたい。
Form2側のコードの表示

VB.NET Form2側のコード
Public Class Form2
'Form1の宣言
Private F1 As Form1
'フォーム起動時に親から呼び出される
Public Sub New(ByVal fomForm1 As Form1)
InitializeComponent() 'これは必ず必要です
F1 = fomForm1
End Sub
'Form1のテキストボックスに書き込む
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
F1.TextBox2.Text = TextBox1.Text
End Sub
End Class
・Public Sub New(ByVal fomForm1 As Form1)
Sub Newはフォームのインスタンスが作される時必ず呼び出され、更にForm1で
起動時に渡した、Form1のインスタンスも引数で 渡ってきます。
   ・Form1 = fomForm1
さらに渡ってきたForm1のインスタンスを、Form2で宣言したForm1のインスタンスF1に 代入しています。
これででForm1のインスタンスF1にアクセスが出来ます。
画像 (download)上記コードのダウンロード
(注意) このFormに関する記事はVB2003をベースに書かれています。
VB2005になってFormの仕様が大きく変わり、又元のVB6の様にエディターで置くだけで、
どのフォームからも参照できる様になりました。
これはデフォルトインスタンスを言って、エディターが自動的にインスタンスを作成します。
つまりForm2をエディターで置いてForm1上でForm2.Visivle = True とすると、Form2が表示されます。
又Form1上のテキストボックスTextBox1に「Hello!」と書き込むにはForm1.TextBox1.Text="Hello!"
とすれば良いのです。
何のことは有りません、VB6と同じになったのです。
VB.NETに慣れたFormも単純なクラスであると理解している人には、Formは複雑です。
VB6から移行した人には、極めて単純です。
もちろん今までの方法も使用できます、念の為に。
ただしこれには賛否両論があります、私は中立です。
画像ファイル