忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

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

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

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

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

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

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

親フォームのクラス

''' 
''' 子フォームを呼出す親フォーム
''' 
Public Class frmPropTextMain

    ''' 
    ''' TextBox1の「Text」プロパティ
    ''' 
    ''' 設定文字列
    ''' TextBox1の文字列を返す
    Public Property TextBoxVal As String
        Set(value As String)
            Me.TextBox1.Text = value    'TextBox1に設定
        End Set
        Get
            Return Me.TextBox1.Text     'TextBox1の値を返す
        End Get
    End Property

    ''' 
    ''' TextBox1への設定メソッド
    ''' 
    ''' <param name="astrText">設定文字列</param>
    Public Sub SetTextBox(ByVal astrText As String)
        '自分のプロパティを利用する
        Me.TextBoxVal = astrText
    End Sub

    ''' 
    ''' 「サブフォーム表示」ボタンクリックイベント
    ''' 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'プロパティテストウインドウ生成
        Dim frmPropSub As New frmPropTextSub(Me)
        'ウインドウ表示
        frmPropSub.ShowDialog()
        'プロパティテストウインドウ廃棄
        frmPropSub.Dispose()
        frmPropSub = Nothing
    End Sub

End Class

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

子フォームのクラス

''' 
''' フォーム生成時にメインフォームが必要な子フォーム
''' 
Public Class frmPropTextSub

    'メインフォームオブジェクト
    Private mfrmMain As frmPropTextMain

    ''' 
    ''' このフォームのコンストラクタ
    ''' 
    ''' <param name="afrm">メインフォームオブジェクト</param>
    Sub New(ByVal afrm As frmPropTextMain)

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        'メインフォームオブジェクトの退避
        Me.mfrmMain = afrm
    End Sub

    ''' 
    ''' フォームロードイベント
    ''' 
    Private Sub frmPropTextSub_Load(sender As Object, e As EventArgs) Handles Me.Load
        'メイン側のプロパティでメイン側のTextBox1の内容を取得し、サブ側に設定
        Me.TextBox1.Text = Me.mfrmMain.TextBoxVal
    End Sub

    ''' 
    ''' 「設定(プロパティ)」ボタンクリックイベント
    ''' 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'メイン側のプロパティを使用し、サブのTextBox1の内容を設定
        Me.mfrmMain.TextBoxVal = Me.TextBox1.Text
        '自分を閉じる
        Me.Close()
    End Sub

    ''' 
    ''' 「設定(メソッド)」ボタンクリックイベント
    ''' 
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'メイン側のメソッドを使用し、サブのTextBox1の内容を設定
        Me.mfrmMain.SetTextBox(Me.TextBox1.Text)
        '自分を閉じる
        Me.Close()
    End Sub

End Class

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

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

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

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

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

    Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

    End Sub

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

    'メインフォームオブジェクト ← ここの変数を追加する
    Private mfrmMain As frmPropTextMain

    Sub New(ByVal afrm As frmPropTextMain)

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        'メインフォームオブジェクトの退避 ← ここの処理を追加する
        Me.mfrmMain = afrm
    End Sub



関連する記事

親フォームのコントロールを子フォームからアクセスする方法その2(DirectCast)
フォームクラスにプロパティ宣言し外からアクセスする方法
フォームがKeyDownなどのキーイベントを受取り、ファンクションキー処理をする
最初のフォームActivatedイベントでの処理(1回のみしか処理しない様にする)
初回のフォームActivatedイベント発生させるフォーム継承について
フォームクラス生成時に設定値を同時に渡す方法

おすすめ本












PR

コメント

コメントを書く