programing tip

TabControl에서 TabPage를 숨기는 방법

itbloger 2020. 6. 14. 11:01
반응형

TabControl에서 TabPage를 숨기는 방법


이 질문에는 이미 답변이 있습니다.

WinForms 2.0의 TabControl에서 TabPage를 숨기는 방법?


아니요, 존재하지 않습니다. 원하는 경우 탭을 제거했다가 다시 추가해야합니다. 또는 다른 (타사) 탭 컨트롤을 사용하십시오.


탭 페이지를 숨기기위한 코드 스 니펫

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

탭 페이지를 표시하기위한 코드 스 니펫

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

나는 질문이 오래되었다는 것을 알고 받아 들여진 대답은 오래되었지만 ...

적어도 .NET 4.0에서는 ...

탭을 숨기려면

tabControl.TabPages.Remove(tabPage);

다시 넣으려면 :

tabControl.TabPages.Insert(index, tabPage);

TabPagesControls이것 보다 훨씬 잘 작동 합니다.


Visiblity 속성은 탭 페이지에서 구현되지 않았으며 Insert 메서드도 없습니다.

탭 페이지를 수동으로 삽입하고 제거해야합니다.

다음은 동일한 해결 방법입니다.

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


변형 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;

지금까지 제공된 솔루션은 너무 복잡합니다. 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;
}

@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();
    }
}

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);
}

빈 클래스를 새로 만들어서 그 안에 넣습니다.

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);.


    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");

탭의 원래 순서는 익명 함수 안에 완전히 숨겨져있는 목록에 유지됩니다. 함수 인스턴스에 대한 참조를 유지하고 원래 탭 순서를 유지하십시오.


숨기려면 탭 페이지의 부모를 null로 설정하고 설정된 탭 페이지 부모를 tabcontrol에 표시합니다.


기존 코드를 엉망으로 만들고 싶지 않고 탭을 숨기려면 탭 생성을 탭 제어에 추가하는 행을 주석 처리하도록 컴파일러 생성 코드를 수정할 수 있습니다.

예를 들어, 다음 행은 "readformatcardpage"라는 탭을 "tabcontrol"이라는 Tabcontrol에 추가합니다.

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

다음은 tabcontrol에 탭을 추가하지 못하게합니다.

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


Microsoft의 경우 +1 :-).
이 방법으로 관리했습니다 :
( Next다음 TabPage를 표시 하는 버튼이 있다고 가정합니다 - tabSteps탭 컨트롤의 이름입니다)
시작할 때 모든 페이지를 적절한 목록에 저장하십시오.
사용자가 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);
    }
}  

저렴한 작업으로 레이블을 사용하여 숨기고 싶은 탭을 덮었습니다.

We can then use the visible prop of the label as a substitute. If anyone does go this route, don't forget to handle keyboard strokes or visibility events. You wouldn't want the left right cursor keys exposing the tab you're trying to hide.


Not sure about "Winforms 2.0" but this is tried and proven:

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


In WPF, it's pretty easy:

Assuming you've given the TabItem a name, e.g.,

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

You could have the following in the code behind the form:

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

It should be noted that a User object named user has been created with it's AccessLevel property set to one of the user-defined enum values of AccessLevelEnum... whatever; it's just a condition by which I decide to show the tab or not.


I also had this question. tabPage.Visible is not implemented as stated earlier, which was a great help (+1). I found you can override the control and this will work. A bit of necroposting, but I thought to post my solution here for others...

    [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;
    }
}

I've used the same approach but the problem is that when tab page was removed from the tab control TabPages list, it is removed from the tab page Controls list also. And it is not disposed when form is disposed.

So if you have a lot of such "hidden" tab pages, you can get windows handle quota exceeded error and only application restart will fix it.


If you are talking about AjaxTabControlExtender then set TabIndex of every tabs and set Visible property True/False according to your need.

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


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;
    }
}

// inVisible
TabPage page2 = tabControl1.TabPages[0];
page2.Visible= false;
//Visible 
page2.Visible= true;
// disable
TabPage page2 = tabControl1.TabPages[0];
page2.Enabled = false;
// enable
page2.Enabled = true;
//Hide
tabCtrlTagInfo.TabPages(0).Hide()
tabCtrlTagInfo.TabPages(0).Show()

Just copy paste and try it,the above code has been tested in vs2010, it works.


Hide TabPage and Remove the Header:

this.tabPage1.Hide();
this.tabPage3.Hide();
this.tabPage5.Hide();
tabControl1.TabPages.Remove(tabPage1);
tabControl1.TabPages.Remove(tabPage3);
tabControl1.TabPages.Remove(tabPage5);

Show TabPage and Visible the Header:

tabControl1.TabPages.Insert(0,tabPage1);
tabControl1.TabPages.Insert(2, tabPage3);
tabControl1.TabPages.Insert(4, tabPage5);
this.tabPage1.Show();
this.tabPage3.Show();
this.tabPage5.Show();
tabControl1.SelectedTab = tabPage1;

참고URL : https://stackoverflow.com/questions/552579/how-to-hide-tabpage-from-tabcontrol

반응형