ヘッダー
Visual Basic サンプル集
VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019

タブコントロールのページを非表示にする

1.タブページの表示・非表示を切り替える例

前提

フォームにTabControl1という名前のページを2つ以上含むタブコントロールが貼り付けられている。

 

Button1をクリックすると2番目のタブページを表示します。Button2をクリックすると非表示にします。

このサンプルに登場するTabControlAdapterクラスは汎用で使用できます。このままコピー・貼り付けしてください。

フォーム側ではクラスレベルの変数としてTabControlAdapterを宣言してください。下記の例では変数名はadapterです。そして、初期の段階でインスタンス化してください。この例ではForm1_Shownでインスタンス化しています。

VB2005 VB2008 VB2010 VB2012 VB2013 VB2015 VB2017 VB2019
Public Class Form1

    Dim adapter As TabControlAdapter

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
        adapter = New TabControlAdapter(Me.TabControl1)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '2番目のページを表示します。
        adapter.PageVisible(1) = True

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        '2番目のページを非表示にします。
        adapter.PageVisible(1) = False

    End Sub

End Class

''' <summary>
''' タブコントロールの各ページの表示・非表示を切り替えます。
''' インスタンス生成時点で存在していたページだけが対象です。
''' 後からページを追加・削除する場合は、追加・削除した後にインスタンスを再生成してください。
''' 次の例は2つ目のページを非表示にします。
''' <para>
''' Dim adapter As TabControlAdapter
''' adapter = New TabControlAdapter(Me.TabControl1) 'インスタンス生成
''' adapter.PageVisible(1) = False
''' </para>
''' </summary>
Public Class TabControlAdapter

    Private Property TabControl As TabControl
    ''' <summary>インスタンス生成時に存在したページです。非表示状態のページも保持します。</summary>
    Public Property TabPages As List(Of TabPage)

    ''' <summary>対応するTabPagesの各ページが表示されているかいないかを示します。</summary>
    Private Property Visibles As List(Of Boolean)

    Public Sub New(tabControl As TabControl)

        Me.TabControl = tabControl
        Me.TabPages = New List(Of TabPage)
        Me.Visibles = New List(Of Boolean)
        For i As Integer = 0 To tabControl.TabPages.Count - 1
            TabPages.Add(tabControl.TabPages(i))
            Visibles.Add(True)
        Next

    End Sub

    ''' <summary>
    ''' ページの表示・非表示を設定します。
    ''' </summary>
    ''' <param name="page"></param>
    ''' <returns></returns>
    Default Public Property PageVisible(page As TabPage) As Boolean
        Get
            For index As Integer = 0 To TabPages.Count - 1
                If TabPages(index) Is page Then
                    Return Visibles(index)
                End If
            Next
            Throw New ArgumentOutOfRangeException("存在しないタブページです。")
        End Get
        Set(value As Boolean)
            For index As Integer = 0 To TabPages.Count - 1
                If TabPages(index) Is page Then
                    Me.PageVisible(index) = value
                    Return
                End If
            Next
        End Set
    End Property

    ''' <summary>
    ''' 番号を使って指定したページの表示・非表示を設定します。
    ''' </summary>
    ''' <param name="index"></param>
    ''' <returns></returns>
    Default Public Property PageVisible(index As Integer) As Boolean
        Get
            Return Visibles(index)
        End Get
        Set(value As Boolean)
            If Visibles(index) = value Then
                Return
            End If
           
Visibles(index) = value
            Refresh()
        End Set
    End Property

    ''' <summary>
    ''' 実際にページの表示・非表示を切り替えます。
    ''' </summary>
    Private Sub Refresh()

        For i As Integer = Visibles.Count - 1 To 0 Step -1
            Dim visible As Boolean = Visibles(i)
            Dim page As TabPage = TabPages(i)

            TabControl.TabPages.Remove(page)

            If (visible) AndAlso (TabControl.TabPages.Contains(page) = False) Then
                TabControl.TabPages.Insert(0, page)
            End If
        Next

    End Sub

End Class

タブページの表示・非表示を切り替える手段は標準では提供されていないためこのように自作する必要があります。

タブコントロールは初期の.NETの実装引きずっており、少し扱いにくいです。そのためプログラムも長くなってしまいました。