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を隠し、再び表示できるようにするためのコードを書いてみました。まずは、次のようなクラスを用意します。
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
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を表示させるようにしています。
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
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); }
(この記事は「.NETプログラミング研究 第34号」で紹介したものです。)