VB.NET Tips - 親フォームのコントロールを子フォームからアクセスする方法

ある親フォームから別の子フォームを表示し、その子フォームから親のフォームのコントロールをアクセスしたい場合があります。 親フォームに公開プロパティ及び公開メソッドを持ち、それを介してデータのやり取りを行います。

以下の例では、親フォームから子フォームを呼出した時に、子フォームから親フォームのテキストボックスの 「Text」を取得し、子フォームのテキストボックスの「Text」に初期設定します。
その後、子フォームのボタンを押下することで、親フォームのテキストボックスの「Text」に 子フォームのテキストボックスの「Text」を再設定します。

以下の画像は、親フォームのテキストボックスに「aaaaa」を入力し、子フォームを表示した子フォームを表示した様子です。

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

以下のソースは、親フォームのクラスの宣言ですが、子フォームから直接テキストボックスにアクセスせずに プロパティを介して行う様にしています。
また、プロパティではなくメソッドからアクセスできる様にもしてあります。 (内容的には自分自身のプロパティを利用してはいますが)

親フォームのクラス

01''' <summary>
02''' 子フォームを呼出す親フォーム
03''' </summary>
04Public 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 
42End Class

子フォームの処理は以下の様になります。

子フォームのクラス

01''' <summary>
02''' フォーム生成時にメインフォームが必要な子フォーム
03''' </summary>
04Public 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 
52End Class

この子ウインドウのコンストラクタでは、引数の親フォームのオブジェクト参照を プライベート変数に退避しています。 この変数を介して親フォームクラスのプロパティ及び、メソッドにアクセスします。

フォームロード時には親フォームのテキストボックスの内容を、 自分自身のテキストボックスに設定しています。

「設定(プロパティ)」ボタンクリックイベントでは 自分自身のテキストボックスの内容を、親フォームのプロパティに設定し、 それにより親フォームのテキストボックスの内容が変更されます。 「設定(メソッド)」ボタンクリックイベントでは、 親フォームのメソッドを呼び出すことで 親フォームのテキストボックスの内容を変更しています。

通常ではコンストラクタを変更することは無いのですが、 コンストラクタに引数を持たせるための方法を説明します。

最初に子フォームのソース上で Sub New と入力した時点で 以下のソースまでは自動で生成されますので、あとは「呼び出しの後で初期化を追加します。」の 後に必要な処理を追加します。

1Sub New()
2 
3    ' この呼び出しはデザイナーで必要です。
4    InitializeComponent()
5 
6    ' InitializeComponent() 呼び出しの後で初期化を追加します。
7 
8End Sub

今回の例ではクラス生成の時の引数として親フォームの参照を渡しますので、 ソースは以下の様になります。

01'メインフォームオブジェクト ← ここの変数を追加する
02Private mfrmMain As frmPropTextMain
03 
04Sub New(ByVal afrm As frmPropTextMain)
05 
06    ' この呼び出しはデザイナーで必要です。
07    InitializeComponent()
08 
09    ' InitializeComponent() 呼び出しの後で初期化を追加します。
10 
11    'メインフォームオブジェクトの退避 ← ここの処理を追加する
12    Me.mfrmMain = afrm
13End Sub
総アクセス数