VB.NETフォーム内のコントロールを名前で探して取得する

スポンサーリンク

フォーム内のコントロールを名前で探して取得するには、Controls プロパティでコントロールを列挙し、その Name プロパティと合致しているか判断することで可能です。Controls プロパティで列挙されたコントロールの中にさらにコントロールが含まれる場合がありますので、再帰呼び出しが必要となります。

以下のように FindControl メソッドという静的なメソッドを書きます。このメソッドの第 1 引数は、親となるコントロールです。フォーム内を探したい場合は、そのフォームのインスタンスを指定します。フォームに限らず、GroupBox などのコントロールを指定することで、GroupBox 内のみを検索することが可能です。

ただ、私はこのような方法は好ましいと思いません。なぜならば、コンパイル解決できていないからです。コンパイル時にそのコントロールが存在していることを保証できません。本来は、参照そのものを別で管理しておくべきだと思います。

サンプルコード

以下にサンプルコードを示します。

VB.NET 全般
''' ---------------------------------------------------------------------------------------
''' <summary>
'''     指定したコントロール内に含まれるコントロールを指定した名前で検索します。</summary>
''' <param name="hParent">
'''     検索対象となる親コントロール。</param>
''' <param name="stName">
'''     検索するコントロールの名前。</param>
''' <returns>
'''     取得したコントロールのインスタンス。取得できなかった場合は Nothing。</returns>
''' ---------------------------------------------------------------------------------------
Public Shared Function FindControl(ByVal hParent As Control, ByVal stName As String) As Control
    ' hParent 内のすべてのコントロールを列挙する
    For Each cControl As Control In hParent.Controls
        ' 列挙したコントロールにコントロールが含まれている場合は再帰呼び出しする
        If cControl.HasChildren Then
            Dim cFindControl As Control = FindControl(cControl, stName)

            ' 再帰呼び出し先でコントロールが見つかった場合はそのまま返す
            If Not cFindControl Is Nothing Then
                Return cFindControl
            End If
        End If

        ' コントロール名が合致した場合はそのコントロールのインスタンスを返す
        If cControl.Name = stName Then
            Return cControl
        End If
    Next cControl
End Function

使用例は以下のようになります。

VB.NET 全般
    ' 現在のフォーム内から、TextBox1 という名前のコントロールを探す
    Dim cFindControl As Control = FindControl(Me, "TextBox1")

    ' 見つかった場合は Text プロパティを表示する
    If Not cFindControl Is Nothing Then
        MessageBox.Show(cFindControl.Text)
    End If

関連するリファレンス

準備中です。

スポンサーリンク