web-dev-qa-db-ja.com

TabControlからTabPageを非表示にする方法

WinForms 2.0でTabControlからTabPageを非表示にする方法

144

いいえ、これは存在しません。タブを削除して、必要なときに再度追加する必要があります。または、別の(サードパーティの)タブコントロールを使用します。

130
Marc Gravell

TabPageを非表示にするためのコードスニペット

private void HideTab1_Click(object sender, EventArgs e)
{
    tabControl1.TabPages.Remove(tabPage1);
}

TabPageを表示するためのコードスニペット

private void ShowTab1_Click(object sender, EventArgs e)
{
    tabControl1.TabPages.Add(tabPage1);
}
93
moonshine

私は質問が古いこと、そして受け入れられた答えが古いことを理解していますが...

少なくとも.NET 4.0では...

タブを非表示にするには:

tabControl.TabPages.Remove(tabPage);

元に戻すには:

tabControl.TabPages.Insert(index, tabPage);

TabPagesは、Controlsよりもはるかにうまく機能します。

38
Jesse Chisholm

Visiblityプロパティはタブページに実装されておらず、Insertメソッドもありません。

タブページを手動で挿入および削除する必要があります。

同じ問題の回避策を次に示します。

http://www.dotnetspider.com/resources/18344-Hiding-Showing-Tabpages-Tabcontrol.aspx

29
amazedsaint

バリアント1

視覚的なklikeringを回避するには、以下を使用する必要があります。

bindingSource.RaiseListChangeEvent = false 

または

myTabControl.RaiseSelectedIndexChanged = false

タブページを削除します。

myTabControl.Remove(myTabPage);

タブページを追加します。

myTabControl.Add(myTabPage);

特定の場所にタブページを挿入します。

myTabControl.Insert(2, myTabPage);

変更を元に戻すことを忘れないでください:

bindingSource.RaiseListChangeEvent = true;

または

myTabControl.RaiseSelectedIndexChanged = true;

バリアント2

myTabPage.parent = null;
myTabPage.parent = myTabControl;
19
profimedica

これまでに提供されたソリューションは非常に複雑です。最も簡単な解決策は次のとおりです: http://www.codeproject.com/Questions/614157/How-to-Hide-TabControl-Headers

このメソッドを使用して、実行時にそれらを非表示にすることができます。

private void HideAllTabsOnTabControl(TabControl theTabControl)
{
  theTabControl.Appearance = TabAppearance.FlatButtons;
  theTabControl.ItemSize = new Size(0, 1);
  theTabControl.SizeMode = TabSizeMode.Fixed;
}
13
mas

@Jack Griffinからの回答と@amazedsaintからの回答(それぞれ dotnetspiderコードスニペット )を単一のTabControlHelperに結合しました。

TabControlHelperでは次のことができます。

  • すべてのタブページの表示/非表示
  • 単一のタブページの表示/非表示
  • タブページの元の位置を維持する
  • タブページを入れ替える

public class TabControlHelper
{
    private TabControl _tabControl;
    private List<KeyValuePair<TabPage, int>> _pagesIndexed;
    public TabControlHelper(TabControl tabControl)
    {
        _tabControl = tabControl;
        _pagesIndexed = new List<KeyValuePair<TabPage, int>>();

        for (int i = 0; i < tabControl.TabPages.Count; i++)
        {
            _pagesIndexed.Add(new KeyValuePair<TabPage, int> (tabControl.TabPages[i], i ));
        }
    }

    public void HideAllPages()
    {
        for (int i = 0; i < _pagesIndexed.Count; i++)
        {
            _tabControl.TabPages.Remove(_pagesIndexed[i].Key);
        }
    }

    public void ShowAllPages()
    {
        for (int i = 0; i < _pagesIndexed.Count; i++)
        {
            _tabControl.TabPages.Add(_pagesIndexed[i].Key);
        }
    }

    public void HidePage(TabPage tabpage)
    {
        if (!_tabControl.TabPages.Contains(tabpage)) return;
        _tabControl.TabPages.Remove(tabpage);
    }

    public void ShowPage(TabPage tabpage)
    {
        if (_tabControl.TabPages.Contains(tabpage)) return;
        InsertTabPage(GetTabPage(tabpage).Key, GetTabPage(tabpage).Value);
    }

    private void InsertTabPage(TabPage tabpage, int index)
    {
        if (index < 0 || index > _tabControl.TabCount)
            throw new ArgumentException("Index out of Range.");
        _tabControl.TabPages.Add(tabpage);
        if (index < _tabControl.TabCount - 1)
            do
            {
                SwapTabPages(tabpage, (_tabControl.TabPages[_tabControl.TabPages.IndexOf(tabpage) - 1]));
            }
            while (_tabControl.TabPages.IndexOf(tabpage) != index);
        _tabControl.SelectedTab = tabpage;
    }

    private void SwapTabPages(TabPage tabpage1, TabPage tabpage2)
    {
        if (_tabControl.TabPages.Contains(tabpage1) == false || _tabControl.TabPages.Contains(tabpage2) == false)
            throw new ArgumentException("TabPages must be in the TabControls TabPageCollection.");

        int Index1 = _tabControl.TabPages.IndexOf(tabpage1);
        int Index2 = _tabControl.TabPages.IndexOf(tabpage2);
        _tabControl.TabPages[Index1] = tabpage2;
        _tabControl.TabPages[Index2] = tabpage1;
    }

    private KeyValuePair<TabPage, int> GetTabPage(TabPage tabpage)
    {
        return _pagesIndexed.Where(p => p.Key == tabpage).First();
    }
}
6
Bruno Bieri
private System.Windows.Forms.TabControl _tabControl;
private System.Windows.Forms.TabPage _tabPage1;
private System.Windows.Forms.TabPage _tabPage2;

...
// Initialise the controls
...

// "hides" tab page 2
_tabControl.TabPages.Remove(_tabPage2);

// "shows" tab page 2
// if the tab control does not contain tabpage2
if (! _tabControl.TabPages.Contains(_tabPage2))
{
    _tabControl.TabPages.Add(_tabPage2);
}
5

新しい空のクラスを作成し、その中に入れます:

using System.Windows.Forms;

namespace ExtensionMethods
{
    public static class TabPageExtensions
    {

        public static bool IsVisible(this TabPage tabPage)
        {
            if (tabPage.Parent == null)
                return false;
            else if (tabPage.Parent.Contains(tabPage))
                return true;
            else
                return false;
        }

        public static void HidePage(this TabPage tabPage)
        {
            TabControl parent = (TabControl)tabPage.Parent;
            parent.TabPages.Remove(tabPage);
        }

        public static void ShowPageInTabControl(this TabPage tabPage,TabControl parent)
        {
            parent.TabPages.Add(tabPage);
        }
    }
}

2-フォームコードにExtensionMethods名前空間への参照を追加します。

using ExtensionMethods;

3-これで、yourTabPage.IsVisible();を使用してその可視性を確認し、yourTabPage.HidePage();を使用して非表示にし、yourTabPage.ShowPageInTabControl(parentTabControl);を使用して表示できます。

4
Mhdali

非表示のためにタブページの親をnullに設定し、タブコントロールに設定されたタブページの親を表示することができます

1
Abuleen

Microsoftの場合は+1 :-)。
この方法で管理できました。
(次のTabPageを表示するNextボタンがあると仮定します-tabStepsはTabコントロールの名前です)
起動時に、すべてのタブページを適切なリストに保存します。
ユーザーがNextボタンを押すと、タブコントロール内のすべてのTabPageが削除され、適切なインデックスで追加されます。

int step = -1;
List<TabPage> savedTabPages;

private void FMain_Load(object sender, EventArgs e) {
    // save all tabpages in the list
    savedTabPages = new List<TabPage>();
    foreach (TabPage tp in tabSteps.TabPages) {
        savedTabPages.Add(tp);
    }
    SelectNextStep();
}

private void SelectNextStep() {
    step++;
    // remove all tabs
    for (int i = tabSteps.TabPages.Count - 1; i >= 0 ; i--) {
            tabSteps.TabPages.Remove(tabSteps.TabPages[i]);
    }

    // add required tab
    tabSteps.TabPages.Add(savedTabPages[step]);
}

private void btnNext_Click(object sender, EventArgs e) {
    SelectNextStep();
}

更新

public class TabControlHelper {
    private TabControl tc;
    private List<TabPage> pages;
    public TabControlHelper(TabControl tabControl) {
        tc = tabControl;
        pages = new List<TabPage>();
        foreach (TabPage p in tc.TabPages) {
            pages.Add(p);
        }
    }

    public void HideAllPages() {
        foreach(TabPage p in pages) {
            tc.TabPages.Remove(p);
        }
    }

    public void ShowAllPages() {
        foreach (TabPage p in pages) {
            tc.TabPages.Add(p);
        }
    }

    public void HidePage(TabPage tp) {
        tc.TabPages.Remove(tp);
    }        

    public void ShowPage(TabPage tp) {
        tc.TabPages.Add(tp);
    }
}  
1
Jack Griffin

既存のコードを台無しにせずに、単にタブを非表示にしたい場合は、コンパイラが生成したコードを変更して、タブをtabcontrolに追加する行をコメント化できます。

例:次の行は、「readformatcardpage」という名前のタブを「tabcontrol」という名前のTabcontrolに追加します。

this.tabcontrol.Controls.Add(this.readformatcardpage);

以下は、tabcontrolへのタブの追加を防ぎます

//this.tabcontrol.Controls.Add(this.readformatcardpage);

1
user720694
    public static Action<Func<TabPage, bool>> GetTabHider(this TabControl container) {
        if (container == null) throw new ArgumentNullException("container");

        var orderedCache = new List<TabPage>();
        var orderedEnumerator = container.TabPages.GetEnumerator();
        while (orderedEnumerator.MoveNext()) {
            var current = orderedEnumerator.Current as TabPage;
            if (current != null) {
                orderedCache.Add(current);
            }
        }

        return (Func<TabPage, bool> where) => {
            if (where == null) throw new ArgumentNullException("where");

            container.TabPages.Clear();
            foreach (TabPage page in orderedCache) {
                if (where(page)) {
                    container.TabPages.Add(page);
                }
            }
        };
    }

次のように使用します。

    var hider = this.TabContainer1.GetTabHider();
    hider((tab) => tab.Text != "tabPage1");
    hider((tab) => tab.Text != "tabpage2");

タブの元の順序は、匿名関数内に完全に隠されたリストに保持されます。関数インスタンスへの参照を保持し、元のタブ順序を保持します。

1
Rob
TabPage pageListe, pageDetay;
bool isDetay = false;

private void btnListeDetay_Click(object sender, EventArgs e)
{
    if (isDetay)
    {
        isDetay = false;
        tc.TabPages.Remove(tpKayit);
        tc.TabPages.Insert(0,pageListe);
    }
    else
    {
        tc.TabPages.Remove(tpListe);
        tc.TabPages.Insert(0,pageDetay);
        isDetay = true;
    }
}
0
AlataliHasan

WPFでは、非常に簡単です。

TabItemに名前を付けたと仮定します。たとえば、

<TabItem Header="Admin" Name="adminTab" Visibility="Hidden">
<!-- tab content -->
</TabItem>

フォームの背後にあるコードに次のものを含めることができます。

 if (user.AccessLevel == AccessLevelEnum.Admin)
 {
     adminTab.Visibility = System.Windows.Visibility.Visible;
 }

Userという名前のuserオブジェクトは、AccessLevelのユーザー定義列挙値のいずれかに設定されたAccessLevelEnumプロパティで作成されていることに注意してください。タブを表示するかどうかを決定する条件です。

0
Jim Daehn

私は同じアプローチを使用しましたが、問題は、タブページがタブコントロールTabPagesリストから削除されたときに、タブページコントロールリストからも削除されることです。そして、フォームが破棄されるときに破棄されません。

そのため、このような「非表示」タブページが多数ある場合は、 Windowsがクォータ超過エラーを処理する を使用すると、アプリケーションを再起動するだけで修正できます。

0
oleksa

「Winforms 2.0」についてはわかりませんが、これは試され、実証されています。

http://www.mostthingsweb.com/2011/01/hiding-tab-headers-on-a-tabcontrol-in-c/

0
Jake

安価な回避策として、非表示にしたいタブを隠すためにラベルを使用しました。

次に、ラベルの目に見える小道具を代用として使用できます。誰かがこの方法を使用する場合は、キーボードストロークまたは可視性イベントを処理することを忘れないでください。非表示にしようとしているタブを左右のカーソルキーで公開したくないでしょう。

0
Kevin Godwin

この質問もありました。 tabPage.Visibleは前述のように実装されていません。これは非常に役立ちました(+1)。コントロールをオーバーライドでき、これが機能することがわかりました。少しネクロポスティングですが、他の人のためにここに自分のソリューションを投稿しようと思いました...

    [System.ComponentModel.DesignerCategory("Code")]
public class MyTabPage : TabPage
{
    private TabControl _parent;
    private bool _isVisible;
    private int _index;
    public new bool Visible
    {
        get { return _isVisible; }
        set
        {
            if (_parent == null) _parent = this.Parent as TabControl;
            if (_parent == null) return;

            if (_index < 0) _index = _parent.TabPages.IndexOf(this);
            if (value && !_parent.TabPages.Contains(this))
            {
                if (_index > 0) _parent.TabPages.Insert(_index, this);
                else _parent.TabPages.Add(this);
            }
            else if (!value && _parent.TabPages.Contains(this)) _parent.TabPages.Remove(this);

            _isVisible = value;
            base.Visible = value;
        }
    }

    protected override void InitLayout()
    {
        base.InitLayout();
        _parent = Parent as TabControl;
    }
}
0
John S.

AjaxTabControlExtenderについて話している場合は、すべてのタブのTabIndexを設定し、必要に応じてVisibleプロパティをTrue/Falseに設定します。

myTab.Tabs [1] .Visible = true/false;

0
Minhajul Islam