DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

TabControlのTabPageを非表示にする

TabControlコントロールに表示されているTabPageコントロールを非表示にするには、TabControl.TabPagesプロパティRemoveメソッドRemoveAtメソッド、あるいはRemoveByKeyメソッド(.NET Framework 2.0以降)を使って削除するしかないようです。よって一時的にTabPageを非表示にするには、非表示にするTabPageオブジェクトを保持しておき、Removeメソッドなどで削除し、再び表示するときは、TabControl.TabPagesプロパティのAddメソッドInsertメソッド(.NET Framework 2.0以降)で追加します。

表示しているTabPageと非表示のTabPageを自分で管理するのは面倒ですので、簡単にTabControlのTabPageを隠し、再び表示できるようにするためのコードを書いてみました。まずは、次のようなクラスを用意します。

VB.NET
コードを隠すコードを選択
Public Class TabPageManager
    Private Class TabPageInfo
        Public TabPage As TabPage
        Public Visible As Boolean

        Public Sub New(ByVal page As TabPage, ByVal v As Boolean)
            TabPage = page
            Visible = v
        End Sub
    End Class

    Private _tabPageInfos As TabPageInfo() = Nothing
    Private _tabControl As TabControl = Nothing

    ''' <summary>
    ''' TabPageManagerクラスのインスタンスを作成する
    ''' </summary>
    ''' <param name="crl">基になるTabControlオブジェクト</param>
    Public Sub New(ByVal crl As TabControl)
        _tabControl = crl
        _tabPageInfos = _
            New TabPageInfo(_tabControl.TabPages.Count - 1) {}
        Dim i As Integer
        For i = 0 To _tabControl.TabPages.Count - 1
            _tabPageInfos(i) = _
                New TabPageInfo(_tabControl.TabPages(i), True)
        Next i
    End Sub

    ''' <summary>
    ''' TabPageの表示・非表示を変更する
    ''' </summary>
    ''' <param name="index">変更するTabPageのIndex番号</param>
    ''' <param name="v">表示するときはTrue。
    ''' 非表示にするときはFalse。</param>
    Public Sub ChangeTabPageVisible( _
        ByVal index As Integer, ByVal v As Boolean)
        If _tabPageInfos(index).Visible = v Then
            Return
        End If
        _tabPageInfos(index).Visible = v
        _tabControl.SuspendLayout()
        _tabControl.TabPages.Clear()
        Dim i As Integer
        For i = 0 To _tabPageInfos.Length - 1
            If _tabPageInfos(i).Visible Then
                _tabControl.TabPages.Add(_tabPageInfos(i).TabPage)
            End If
        Next i
        _tabControl.ResumeLayout()
    End Sub
End Class
C#
コードを隠すコードを選択
public class TabPageManager
{
    private class TabPageInfo
    {
        public TabPage TabPage;
        public bool Visible;
        public TabPageInfo(TabPage page, bool v)
        {
            TabPage = page;
            Visible = v;
        }
    }
    private TabPageInfo[] _tabPageInfos = null;
    private TabControl _tabControl = null;

    /// <summary>
    /// TabPageManagerクラスのインスタンスを作成する
    /// </summary>
    /// <param name="crl">基になるTabControlオブジェクト</param>
    public TabPageManager(TabControl crl)
    {
        _tabControl = crl;
        _tabPageInfos = new TabPageInfo[_tabControl.TabPages.Count];
        for(int i = 0; i < _tabControl.TabPages.Count; i++)
            _tabPageInfos[i] =
                new TabPageInfo(_tabControl.TabPages[i], true);
    }

    /// <summary>
    /// TabPageの表示・非表示を変更する
    /// </summary>
    /// <param name="index">変更するTabPageのIndex番号</param>
    /// <param name="v">表示するときはTrue。
    /// 非表示にするときはFalse。</param>
    public void ChangeTabPageVisible(int index, bool v)
    {
        if (_tabPageInfos[index].Visible == v)
            return;

        _tabPageInfos[index].Visible = v;
        _tabControl.SuspendLayout();
        _tabControl.TabPages.Clear();
        for(int i = 0; i < _tabPageInfos.Length; i++)
        {
            if (_tabPageInfos[i].Visible)
                _tabControl.TabPages.Add(_tabPageInfos[i].TabPage);
        }
        _tabControl.ResumeLayout();
    }
}

このTabPageManagerクラスを使ってTabControlのTabPageを隠し、再び表示させるには、次のようにします。ここではフォーム(Form1)にTabControl(TabControl1)が配置されており、TabControl1にいくつかのTabPageが追加されている時、Button1のクリックによりTabControl1の一番先頭のTabPageを隠し、さらに、Button2のクリックにより再びこのTabPageを表示させるようにしています。

VB.NET
コードを隠すコードを選択
Private _tabPageManager As TabPageManager

'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As EventArgs) Handles MyBase.Load
    'TabPageManagerオブジェクトの作成
    _tabPageManager = New TabPageManager(TabControl1)
End Sub

'Button1のClickイベントハンドラ
Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
    '0番目のTabPageを非表示にする
    _tabPageManager.ChangeTabPageVisible(0, False)
End Sub

'Button2のClickイベントハンドラ
Private Sub Button2_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button2.Click
    '0番目のTabPageを表示する
    _tabPageManager.ChangeTabPageVisible(0, True)
End Sub
C#
コードを隠すコードを選択
TabPageManager _tabPageManager = null;

//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
    //TabPageManagerオブジェクトの作成
    _tabPageManager = new TabPageManager(TabControl1);
}

//Button1のClickイベントハンドラ
private void Button1_Click(object sender, System.EventArgs e)
{
    //0番目のTabPageを非表示にする
    _tabPageManager.ChangeTabPageVisible(0, false);
}

//Button2のClickイベントハンドラ
private void button2_Click(object sender, System.EventArgs e)
{
    //0番目のTabPageを表示する
    _tabPageManager.ChangeTabPageVisible(0, true);
}
  • 履歴:
  • 2014/6/2 .NET Framework 2.0から追加されたRemoveByKeyメソッドとInsertメソッドの説明を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。