Скрытие и отображение вкладок в tabControl - PullRequest
32 голосов
/ 29 июля 2010

Я пытаюсь показать или скрыть вкладки по выбору пользователя. Если пользователь выбирает пол мужской, то на вкладке «мужчина» должна отображаться форма для мужчины, а если пользователь выбирает женщину, аналогичная следующая форма должна отображаться на следующей вкладке «женщина»

Я пытался использовать

tabControl1.TabPages.Remove(...)

и

tabControl1.TabPages.Add(...)

Он добавляет и удаляет вкладки, но при этом также теряются мои элементы управления на вкладках ... Я не вижу их обратно. в чем здесь проблема?

Ответы [ 18 ]

0 голосов
/ 12 июля 2017
TabPanel1.Visible = true; // Show Tabpage 1
TabPanel1.Visible = false; //Hide Tabpage 1
0 голосов
/ 17 марта 2017
    Public Shared HiddenTabs As New List(Of TabPage)()
Public Shared Visibletabs As New List(Of TabPage)()
Public Shared Function ShowTab(tab_ As TabPage, show_tab As Boolean)
    Select Case show_tab
        Case True
            If Visibletabs.Contains(tab_) = False Then Visibletabs.Add(tab_)
            If HiddenTabs.Contains(tab_) = True Then HiddenTabs.Remove(tab_)
        Case False
            If HiddenTabs.Contains(tab_) = False Then HiddenTabs.Add(tab_)
            If Visibletabs.Contains(tab_) = True Then Visibletabs.Remove(tab_)
    End Select
    For Each r In HiddenTabs
        Try
            Dim TC As TabControl = r.Parent
            If TC.Contains(r) = True Then TC.TabPages.Remove(r)
        Catch ex As Exception

        End Try
    Next
    For Each a In Visibletabs
        Try
            Dim TC As TabControl = a.Parent
            If TC.Contains(a) = False Then TC.TabPages.Add(a)
        Catch ex As Exception

        End Try
    Next
End Function
0 голосов
/ 27 июля 2015

Я использовал тот же подход для сохранения скрытых вкладок TabPages в приватном списке, но проблема в том, что когда я хочу снова отобразить TabPage, они не отображаются в исходном положении (порядке). Итак, наконец, я написал класс в VB для добавления TabControl с двумя методами: HideTabPageByName и ShowTabPageByName. Вы можете просто вызвать методы, передающие имя (не экземпляр TabPage).

Public Class CS_Control_TabControl
    Inherits System.Windows.Forms.TabControl

    Private mTabPagesHidden As New Dictionary(Of String, System.Windows.Forms.TabPage)
    Private mTabPagesOrder As List(Of String)

    Public Sub HideTabPageByName(ByVal TabPageName As String)
        If mTabPagesOrder Is Nothing Then
            ' The first time the Hide method is called, save the original order of the TabPages
            mTabPagesOrder = New List(Of String)
            For Each TabPageCurrent As TabPage In Me.TabPages
                mTabPagesOrder.Add(TabPageCurrent.Name)
            Next
        End If

        If Me.TabPages.ContainsKey(TabPageName) Then
            Dim TabPageToHide As TabPage

            ' Get the TabPage object
            TabPageToHide = TabPages(TabPageName)
            ' Add the TabPage to the internal List
            mTabPagesHidden.Add(TabPageName, TabPageToHide)
            ' Remove the TabPage from the TabPages collection of the TabControl
            Me.TabPages.Remove(TabPageToHide)
        End If
    End Sub

    Public Sub ShowTabPageByName(ByVal TabPageName As String)
        If mTabPagesHidden.ContainsKey(TabPageName) Then
            Dim TabPageToShow As TabPage

            ' Get the TabPage object
            TabPageToShow = mTabPagesHidden(TabPageName)
            ' Add the TabPage to the TabPages collection of the TabControl
            Me.TabPages.Insert(GetTabPageInsertionPoint(TabPageName), TabPageToShow)
            ' Remove the TabPage from the internal List
            mTabPagesHidden.Remove(TabPageName)
        End If
    End Sub

    Private Function GetTabPageInsertionPoint(ByVal TabPageName As String) As Integer
        Dim TabPageIndex As Integer
        Dim TabPageCurrent As TabPage
        Dim TabNameIndex As Integer
        Dim TabNameCurrent As String

        For TabPageIndex = 0 To Me.TabPages.Count - 1
            TabPageCurrent = Me.TabPages(TabPageIndex)
            For TabNameIndex = TabPageIndex To mTabPagesOrder.Count - 1
                TabNameCurrent = mTabPagesOrder(TabNameIndex)
                If TabNameCurrent = TabPageCurrent.Name Then
                    Exit For
                End If
                If TabNameCurrent = TabPageName Then
                    Return TabPageIndex
                End If
            Next
        Next
        Return TabPageIndex
    End Function

    Protected Overrides Sub Finalize()
        mTabPagesHidden = Nothing
        mTabPagesOrder = Nothing
        MyBase.Finalize()
    End Sub
End Class
0 голосов
/ 12 сентября 2013

вы всегда можете скрыть или показать вкладку.

'in VB
myTabControl.TabPages(9).Hide() 'to hide the tabpage that has index 9
myTabControl.TabPages(9).Show() 'to show the tabpage that has index 9
0 голосов
/ 04 сентября 2013

Вы можете использовать следующее

tabcontainer.tabs(1).visible=true

1 - tabindex

0 голосов
/ 03 мая 2019

Добавление и удаление вкладки может быть немного менее эффективным. Может быть, это поможет

Скрыть / показать вкладку => let tabPage1 из tabControl1

tapPage1.Parent = null;            //to hide tabPage1 from tabControl1
tabPage1.Parent = tabControl1;     //to show the tabPage1 in tabControl1
0 голосов
/ 27 июня 2019

Кто-то слил ответ C # в этот, поэтому я должен опубликовать свой ответ здесь. Мне не понравились другие решения, поэтому я создал вспомогательный класс, который позволит легче скрывать / показывать ваши вкладки, сохраняя порядок вкладок.

/// <summary>
/// Memorizes the order of tabs upon creation to make hiding / showing tabs more
/// straightforward. Instead of interacting with the TabCollection, use this class
/// instead.
/// </summary>
public class TabPageHelper
{
    private List<TabPage> _allTabs;
    private TabControl.TabPageCollection _tabCollection;
    public Dictionary<string, int> TabOrder { get; private set; }

    public TabPageHelper( TabControl.TabPageCollection tabCollection )
    {
        _allTabs = new List<TabPage>();
        TabOrder = new Dictionary<string, int>();
        foreach ( TabPage tab in tabCollection )
        {
            _allTabs.Add( tab );
        }
        _tabCollection = tabCollection;
        foreach ( int index in Enumerable.Range( 0, tabCollection.Count ) )
        {
            var tab = tabCollection[index];
            TabOrder[tab.Name] = index;
        }
    }

    public void ShowTabPage( string tabText )
    {
        TabPage page = _allTabs
            .Where( t => string.Equals( t.Text, tabText, StringComparison.CurrentCultureIgnoreCase ) )
            .First();
        int tabPageOrder = TabOrder[page.Name];
        if ( !_tabCollection.Contains( page ) )
        {
            _tabCollection.Insert( tabPageOrder, page );
        }
    }

    public void HideTabPage( string tabText )
    {
        TabPage page = _allTabs
            .Where( t => string.Equals( t.Text, tabText, StringComparison.CurrentCultureIgnoreCase ) )
            .First();
        int tabPageOrder = TabOrder[page.Name];
        if ( _tabCollection.Contains( page ) )
        {
            _tabCollection.Remove( page );
        }
    }
}

Чтобы использовать класс, создайте его экземпляр в методе загрузки формы после инициализации компонентов, передав свойство TabPages элемента управления вкладкой.

public Form1()
{
    InitializeComponent();
    _tabHelper = new TabPageHelper( tabControl1.TabPages );
}

Все ваши вкладки должны существовать при загрузке приложения (т. Е. В представлении «Дизайн»), поскольку класс будет запоминать порядок вкладок при скрытии / отображении. Вы можете скрыть или показать их выборочно в приложении:

_tabHelper.HideTabPage("Settings");
_tabHelper.ShowTabPage("Schedule");
0 голосов
/ 02 декабря 2014

Всегда коды должны быть простыми и легкими для выполнения задач для быстрого выполнения и для хорошей надежности.

Чтобы добавить страницу в TabControl, достаточно следующего кода.

If Tabcontrol1.Controls.Contains (TabPage1) Then
else Tabcontrol1.Controls.Add (TabPage1) End If

Для удаления страницы из TabControl достаточно следующего кода.

Если Tabcontrol1.Controls.Contains (TabPage1), то Tabcontrol1.Controls.Remove (TabPage1) End If

Я хочу поблагодарить Stackoverflow.com за искреннюю помощь программистам.

...