VB.NET Tips - 親フォームのコントロールを子フォームからアクセスする方法
ある親フォームから別の子フォームを表示し、その子フォームから親のフォームのコントロールをアクセスしたい場合があります。
親フォームに公開プロパティ及び公開メソッドを持ち、それを介してデータのやり取りを行います。
以下の例では、親フォームから子フォームを呼出した時に、子フォームから親フォームのテキストボックスの
「Text」を取得し、子フォームのテキストボックスの「Text」に初期設定します。
その後、子フォームのボタンを押下することで、親フォームのテキストボックスの「Text」に
子フォームのテキストボックスの「Text」を再設定します。
以下の画像は、親フォームのテキストボックスに「aaaaa」を入力し、子フォームを表示した子フォームを表示した様子です。

その後、子フォームのテキストボックスを「bbbbbbbb」と入力し、子フォームのボタンを押下し親フォームに戻った時を表示した画像です。

以下のソースは、親フォームのクラスの宣言ですが、子フォームから直接テキストボックスにアクセスせずに
プロパティを介して行う様にしています。
また、プロパティではなくメソッドからアクセスできる様にもしてあります。
(内容的には自分自身のプロパティを利用してはいますが)
親フォームのクラス
01 | ''' <summary> |
02 | ''' 子フォームを呼出す親フォーム |
03 | ''' </summary> |
04 | Public Class frmPropTextMain |
05 |
06 | ''' <summary> |
07 | ''' TextBox1の「Text」プロパティ |
08 | ''' </summary> |
09 | ''' <value>設定文字列</value> |
10 | ''' <returns>TextBox1の文字列を返す</returns> |
11 | Public Property TextBoxVal As String |
12 | Set (value As String ) |
13 | Me .TextBox1.Text = value 'TextBox1に設定 |
14 | End Set |
15 | Get |
16 | Return Me .TextBox1.Text 'TextBox1の値を返す |
17 | End Get |
18 | End Property |
19 |
20 | ''' <summary> |
21 | ''' TextBox1への設定メソッド |
22 | ''' </summary> |
23 | ''' <param name="astrText">設定文字列</param> |
24 | Public Sub SetTextBox( ByVal astrText As String ) |
25 | '自分のプロパティを利用する |
26 | Me .TextBoxVal = astrText |
27 | End Sub |
28 |
29 | ''' <summary> |
30 | ''' 「サブフォーム表示」ボタンクリックイベント |
31 | ''' </summary> |
32 | Private Sub Button1_Click(sender As Object , e As EventArgs) Handles Button1.Click |
33 | 'プロパティテストウインドウ生成 |
34 | Dim frmPropSub As New frmPropTextSub( Me ) |
35 | 'ウインドウ表示 |
36 | frmPropSub.ShowDialog() |
37 | 'プロパティテストウインドウ廃棄 |
38 | frmPropSub.Dispose() |
39 | frmPropSub = Nothing |
40 | End Sub |
41 |
42 | End Class |
子フォームの処理は以下の様になります。
子フォームのクラス
01 | ''' <summary> |
02 | ''' フォーム生成時にメインフォームが必要な子フォーム |
03 | ''' </summary> |
04 | Public Class frmPropTextSub |
05 |
06 | 'メインフォームオブジェクト |
07 | Private mfrmMain As frmPropTextMain |
08 |
09 | ''' <summary> |
10 | ''' このフォームのコンストラクタ |
11 | ''' </summary> |
12 | ''' <param name="afrm">メインフォームオブジェクト</param> |
13 | Sub New ( ByVal afrm As frmPropTextMain) |
14 |
15 | ' この呼び出しはデザイナーで必要です。 |
16 | InitializeComponent() |
17 |
18 | ' InitializeComponent() 呼び出しの後で初期化を追加します。 |
19 |
20 | 'メインフォームオブジェクトの退避 |
21 | Me .mfrmMain = afrm |
22 | End Sub |
23 |
24 | ''' <summary> |
25 | ''' フォームロードイベント |
26 | ''' </summary> |
27 | Private Sub frmPropTextSub_Load(sender As Object , e As EventArgs) Handles Me .Load |
28 | 'メイン側のプロパティでメイン側のTextBox1の内容を取得し、サブ側に設定 |
29 | Me .TextBox1.Text = Me .mfrmMain.TextBoxVal |
30 | End Sub |
31 |
32 | ''' <summary> |
33 | ''' 「設定(プロパティ)」ボタンクリックイベント |
34 | ''' </summary> |
35 | Private Sub Button1_Click(sender As Object , e As EventArgs) Handles Button1.Click |
36 | 'メイン側のプロパティを使用し、サブのTextBox1の内容を設定 |
37 | Me .mfrmMain.TextBoxVal = Me .TextBox1.Text |
38 | '自分を閉じる |
39 | Me .Close() |
40 | End Sub |
41 |
42 | ''' <summary> |
43 | ''' 「設定(メソッド)」ボタンクリックイベント |
44 | ''' </summary> |
45 | Private Sub Button2_Click(sender As Object , e As EventArgs) Handles Button2.Click |
46 | 'メイン側のメソッドを使用し、サブのTextBox1の内容を設定 |
47 | Me .mfrmMain.SetTextBox( Me .TextBox1.Text) |
48 | '自分を閉じる |
49 | Me .Close() |
50 | End Sub |
51 |
52 | End Class |
この子ウインドウのコンストラクタでは、引数の親フォームのオブジェクト参照を
プライベート変数に退避しています。
この変数を介して親フォームクラスのプロパティ及び、メソッドにアクセスします。
フォームロード時には親フォームのテキストボックスの内容を、
自分自身のテキストボックスに設定しています。
「設定(プロパティ)」ボタンクリックイベントでは
自分自身のテキストボックスの内容を、親フォームのプロパティに設定し、
それにより親フォームのテキストボックスの内容が変更されます。
「設定(メソッド)」ボタンクリックイベントでは、
親フォームのメソッドを呼び出すことで
親フォームのテキストボックスの内容を変更しています。
通常ではコンストラクタを変更することは無いのですが、
コンストラクタに引数を持たせるための方法を説明します。
最初に子フォームのソース上で Sub New と入力した時点で
以下のソースまでは自動で生成されますので、あとは「呼び出しの後で初期化を追加します。」の
後に必要な処理を追加します。
1 | Sub New () |
2 |
3 | ' この呼び出しはデザイナーで必要です。 |
4 | InitializeComponent() |
5 |
6 | ' InitializeComponent() 呼び出しの後で初期化を追加します。 |
7 |
8 | End Sub |
今回の例ではクラス生成の時の引数として親フォームの参照を渡しますので、 ソースは以下の様になります。
01 | 'メインフォームオブジェクト ← ここの変数を追加する |
02 | Private mfrmMain As frmPropTextMain |
03 |
04 | Sub New ( ByVal afrm As frmPropTextMain) |
05 |
06 | ' この呼び出しはデザイナーで必要です。 |
07 | InitializeComponent() |
08 |
09 | ' InitializeComponent() 呼び出しの後で初期化を追加します。 |
10 |
11 | 'メインフォームオブジェクトの退避 ← ここの処理を追加する |
12 | Me .mfrmMain = afrm |
13 | End Sub |