Как скрыть TabPage от TabControl [дубликат]
этот вопрос уже есть ответ здесь:
- скрытие и отображение вкладок в tabControl 16 ответов
Как скрыть TabPage от TabControl в WinForms 2.0?
22 ответа:
нет, этого не существует. Вы должны удалить вкладку и повторно добавить ее, когда захотите. Или используйте другой (сторонний) элемент управления вкладками.
фрагмент кода для скрытия вкладки
private void HideTab1_Click(object sender, EventArgs e) { tabControl1.TabPages.Remove(tabPage1); }
фрагмент кода для отображения вкладки
private void ShowTab1_Click(object sender, EventArgs e) { tabControl1.TabPages.Add(tabPage1); }
Visiblity свойство не было реализовано на вкладках, и нет метода Insert также.
вам нужно вручную вставлять и удалять вкладки.
вот примерно то же самое.
http://www.dotnetspider.com/resources/18344-Hiding-Showing-Tabpages-Tabcontrol.aspx
Я понимаю, что вопрос старый, и принятый ответ старый, но ...
по крайней мере, в .NET 4.0 ...
скрыть вкладку:
tabControl.TabPages.Remove(tabPage);
чтобы положить его обратно:
tabControl.TabPages.Insert(index, tabPage);
TabPages
работает намного лучше, чемControls
для этого.
Вариант 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; }
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);
показывать.
Я объединил ответ от @Jack Griffin и один от @amazedsaint (фрагмент кода dotnetspider соответственно) в единый TabControlHelper.
на TabControlHelper позволяет:
- Показать / Скрыть все закладки
- Показать / Скрыть отдельные вкладки
- сохранить исходное положение вкладок
- Swap tab pages
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(); } }
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
Ну, если вы не хотите испортить существующий код и просто хотите скрыть вкладку, вы можете изменить сгенерированный компилятором код, чтобы прокомментировать строку, которая добавляет вкладку в tabcontrol.
например: Следующая строка добавляет вкладку с именем "readformatcardpage "в элемент управления Tabcontrol с именем"tabcontrol"
этого.элемент управления TabControl.Контроли.Добавить это.readformatcardpage);
следующее предотвратит добавление вкладки в элемент управления TabControl
//в этом.элемент управления TabControl.Контроли.Добавить это.readformatcardpage);
+1 для microsoft :-) .
Мне удалось сделать это таким образом :
(предполагается, что у вас есть кнопка "Далее", которая отображает следующую вкладку - tabSteps-это имя элемента управления Tab)
При запуске сохраните все вкладки в соответствующем списке . Когда пользователь нажимает кнопку Далее, удалите все вкладки в элементе управления вкладками, а затем добавьте это с соответствующим индексом: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); } }
как дешевая работа вокруг, я использовал метку, чтобы скрыть вкладки, которые я хотел скрыть.
затем мы можем использовать видимую опору этикетки в качестве замены. Если кто-то идет по этому маршруту, не забудьте обработать удары клавиатуры или события видимости. Вы не хотели бы, чтобы левые клавиши курсора открывали вкладку, которую вы пытаетесь скрыть.
Не уверен в "Winforms 2.0", но это проверено и доказано:
http://www.mostthingsweb.com/2011/01/hiding-tab-headers-on-a-tabcontrol-in-c/
в WPF это довольно просто:
предполагая, что вы дали TabItem имя, например,
<TabItem Header="Admin" Name="adminTab" Visibility="Hidden"> <!-- tab content --> </TabItem>
вы могли бы иметь следующее в коде позади формы:
if (user.AccessLevel == AccessLevelEnum.Admin) { adminTab.Visibility = System.Windows.Visibility.Visible; }
следует отметить, что a
User
объектuser
был создан сAccessLevel
свойство устанавливается в одно из определяемых пользователем значений перечисленияAccessLevelEnum
... все равно; это просто условие, по которому я решаю показать вкладку или нет.
У меня тоже был такой вопрос. вкладка.Видимый не реализован, как указано ранее, что было большим подспорьем (+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; } }
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; } }
Я использовал тот же подход, но проблема в том, что когда страница вкладки была удалена из списка вкладок управления вкладками, она также удаляется из списка элементов управления вкладками. И он не утилизируется, когда форма утилизируется.
Так что если у вас есть много таких "скрытых" вкладок, вы можете получить квоту дескриптора windows превышена ошибка и только перезапуск приложения исправит это.
Если вы говорите о AjaxTabControlExtender установить свойство tabindex каждой вкладки, и установить для свойства visible значение true или false в зависимости от ваших потребностей.
myTab.Вкладок[1].Visible=true / false;
// 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()
просто скопируй вставь и попробуй,приведенный выше код был протестирован в vs2010, он работает.
скрыть вкладку и удалить заголовок:
this.tabPage1.Hide(); this.tabPage3.Hide(); this.tabPage5.Hide(); tabControl1.TabPages.Remove(tabPage1); tabControl1.TabPages.Remove(tabPage3); tabControl1.TabPages.Remove(tabPage5);
показать вкладку и виден заголовок:
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;