it-swarm-vi.tech

Cách ẩn TabPage khỏi TabControl

Làm cách nào để ẩn TabPage khỏi TabControl trong WinForms 2.0?

144
Tomasz Smykowski

Không, điều này không tồn tại. Bạn phải xóa tab và thêm lại khi bạn muốn. Hoặc sử dụng điều khiển tab khác (bên thứ 3).

130
Marc Gravell

Đoạn mã để ẩn TabPage

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

Đoạn mã để hiển thị TabPage

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

Tôi nhận ra câu hỏi đã cũ và câu trả lời được chấp nhận là cũ, nhưng ...

Ít nhất là trong .NET 4.0 ...

Để ẩn một tab:

tabControl.TabPages.Remove(tabPage);

Để đặt lại:

tabControl.TabPages.Insert(index, tabPage);

TabPages hoạt động tốt hơn nhiều so với Controls cho việc này.

38
Jesse Chisholm

Thuộc tính Visiblity chưa được triển khai trên Tabpages và cũng không có phương thức Chèn.

Bạn cần phải chèn và xóa các trang tab theo cách thủ công.

Đây là một công việc xung quanh cho cùng.

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

29
amazedsaint

Biến thể 1

Để tránh hiện tượng thị giác, bạn có thể cần phải sử dụng:

bindingSource.RaiseListChangeEvent = false 

hoặc là

myTabControl.RaiseSelectedIndexChanged = false

Xóa một trang tab:

myTabControl.Remove(myTabPage);

Thêm một trang tab:

myTabControl.Add(myTabPage);

Chèn một trang tab tại vị trí cụ thể:

myTabControl.Insert(2, myTabPage);

Đừng quên đảo ngược các thay đổi:

bindingSource.RaiseListChangeEvent = true;

hoặc là

myTabControl.RaiseSelectedIndexChanged = true;

Biến thể 2

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

Các giải pháp được cung cấp cho đến nay là quá phức tạp. Đọc giải pháp đơn giản nhất tại: http://www.codeproject.com/Questions/614157/How-to-Hide-TabControl-Headers

Bạn có thể sử dụng phương pháp này để làm cho chúng vô hình trong thời gian chạy:

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

Tôi đã kết hợp câu trả lời từ @Jack Griffin và câu trả lời từ @amazedsaint ( đoạn mã dotnetspider tương ứng ) thành một TabControlHelper.

TabControlHelper cho phép bạn:

  • Hiển thị/Ẩn tất cả các trang tab
  • Hiển thị/Ẩn các trang tab đơn
  • Giữ vị trí ban đầu của các trang tab
  • Hoán đổi trang tab

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
Nasuh Levent YILDIZ

Tạo một lớp trống mới và vượt qua nó bên trong nó:

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- Thêm tham chiếu vào không gian tên ExtensionMethods trong mã biểu mẫu của bạn:

using ExtensionMethods;

3- Bây giờ bạn có thể sử dụng yourTabPage.IsVisible(); để kiểm tra mức độ hiển thị của nó, yourTabPage.HidePage(); để ẩn nó và yourTabPage.ShowPageInTabControl(parentTabControl); để hiển thị nó.

4
Mhdali

bạn có thể đặt cha mẹ của tabpage thành null để ẩn và để hiển thị chỉ cần đặt cha mẹ của tab vào tabcontrol

1
Abuleen

+1 cho Microsoft :-).
[.__.] Tôi đã làm theo cách này:
[.__.] (giả sử bạn có nút Next hiển thị TabPage tiếp theo - tabSteps là tên của điều khiển Tab)
[.__.] Khi bắt đầu, hãy lưu tất cả các trang trong một danh sách phù hợp.
[.__.] Khi người dùng nhấn nút Next, hãy xóa tất cả các TabPages trong điều khiển tab, sau đó thêm nó với chỉ mục thích hợp:

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

Cập nhật

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

Chà, nếu bạn không muốn làm rối mã hiện có và chỉ muốn ẩn một tab, bạn có thể sửa đổi mã được tạo bởi trình biên dịch để nhận xét dòng có thêm tab vào điều khiển tab.

Ví dụ: Dòng sau đây thêm một tab có tên "readformatcardpage" vào Tabcontrol có tên "tabcontrol"

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

Sau đây sẽ ngăn việc thêm tab vào 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);
                }
            }
        };
    }

Sử dụng nó như thế này:

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

Thứ tự ban đầu của các tab được giữ trong Danh sách được ẩn hoàn toàn bên trong hàm ẩn danh. Giữ một tham chiếu đến thể hiện chức năng và bạn giữ lại thứ tự tab ban đầu của mình.

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

Trong WPF, nó khá dễ:

Giả sử bạn đã đặt tên cho TabItem, ví dụ:

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

Bạn có thể có đoạn mã sau dưới dạng:

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

Cần lưu ý rằng một đối tượng User có tên user đã được tạo với thuộc tính AccessLevel được đặt thành một trong các giá trị enum do người dùng định nghĩa là AccessLevelEnum... đó chỉ là một điều kiện để tôi quyết định hiển thị tab hay không.

0
Jim Daehn

Tôi đã sử dụng cùng một cách tiếp cận nhưng vấn đề là khi trang tab bị xóa khỏi danh sách TabPages kiểm soát tab, nó cũng bị xóa khỏi danh sách Điều khiển trang tab. Và nó không được xử lý khi hình thức được xử lý.

Vì vậy, nếu bạn có nhiều trang tab "ẩn" như vậy, bạn có thể nhận lỗi xử lý vượt quá hạn ngạch của windows và chỉ khởi động lại ứng dụng mới khắc phục được.

0
oleksa

Không chắc chắn về "Winforms 2.0" nhưng điều này đã được thử và chứng minh:

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

0
Jake

Là một công việc rẻ tiền xung quanh, tôi đã sử dụng một nhãn hiệu để che đi các tab tôi muốn ẩn.

Sau đó chúng ta có thể sử dụng chỗ dựa có thể nhìn thấy của nhãn thay thế. Nếu bất cứ ai đi theo con đường này, đừng quên xử lý các nét bàn phím hoặc các sự kiện hiển thị. Bạn sẽ không muốn các phím con trỏ bên trái để lộ tab bạn đang cố ẩn.

0
Kevin Godwin

Tôi cũng đã có câu hỏi này. tabPage.Visible không được triển khai như đã nêu trước đó, đây là một trợ giúp tuyệt vời (+1). Tôi thấy bạn có thể ghi đè lên điều khiển và điều này sẽ hoạt động. Một chút cần thiết, nhưng tôi nghĩ sẽ đăng giải pháp của mình lên đây cho người khác ...

    [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.

Nếu bạn đang nói về AjaxTabControlExtender thì hãy đặt Tab Index của mọi tab và đặt thuộc tính Hiển thị Đúng/Sai theo nhu cầu của bạn.

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

0
Minhajul Islam