Как я могу отключить вкладку внутри TabControl?
1385 23
23 ответов:
на TabPage класс скрывает включенное свойство. Это было намеренно, поскольку с ним возникла неудобная проблема с дизайном пользовательского интерфейса. Основная проблема заключается в том, что отключение страницы также не отключает вкладку. И если попытаться обойти это, отключив вкладку с событием выбора, то она не работает, когда TabControl имеет только одну страницу.
если эти проблемы юзабилити вас не касаются, то имейте в виду, что свойство все еще работает, оно просто скрыто от технология IntelliSense. Если FUD неудобно, то вы можете просто сделать это:
public static void EnableTab(TabPage page, bool enable) { foreach (Control ctl in page.Controls) ctl.Enabled = enable; }
приведите свою вкладку к элементу управления, а затем установите для свойства Enabled значение false.
((Control)this.tabPage).Enabled = false;таким образом, заголовок вкладки по-прежнему будет включен, но его содержимое будет отключено.
вы можете просто использовать:
tabPage.Enabled = false;Это свойство не отображается, но работает без каких-либо проблем.
вы можете запрограммировать событие на выбор
TabControlerчтобы сделать невозможным переход на не редактируемую вкладку:private void tabControler_Selecting(object sender, TabControlCancelEventArgs e) { if (e.TabPageIndex < 0) return; e.Cancel = !e.TabPage.Enabled; }
вы можете зарегистрировать событие "выбор" и отменить переход на вкладку:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { if (e.TabPage == tabPage2) e.Cancel = true; }еще одна идея состоит в том, чтобы поместить все элементы управления на вкладку в Панели управления и отключить панель! Смайлик
вы также можете удалить вкладку из tabControl1.Коллекция вкладок. Это скроет вкладку.
кредиты идут в littleguru @ Channel 9.
предположительно, вы хотите увидеть вкладку в элементе управления tab, но вы хотите, чтобы она была "отключена" (т. е. серая и не выбираемая). Нет встроенной поддержки для этого, но вы можете переопределить механизм рисования, чтобы дать желаемый эффект.
пример того, как это сделать предоставлены здесь.
магия находится в этом фрагменте из представленного источника и в методе DisableTab_DrawItem:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
расширение на ответ Cédric Guillemette, после отключения
Control:((Control)this.tabPage).Enabled = false;...затем вы можете обрабатывать
TabControl' sSelectingсобытие:private void tabControl_Selecting(object sender, TabControlCancelEventArgs e) { e.Cancel = !((Control)e.TabPage).Enabled; }
это приведет к удалению вкладки, но вам нужно будет повторно добавить его, когда вам это нужно:
tabControl1.Controls.Remove(tabPage2);Если вам это понадобится позже, вы можете сохранить его во временной вкладке перед удалением, а затем повторно добавить его при необходимости.
Я должен был справиться с этим некоторое время назад. Я удалил вкладку из коллекции TabPages (я думаю, что это все) и добавил ее обратно, когда условия изменились. Но это было только в Winforms, где я мог держать вкладку вокруг, пока она мне снова не понадобится.
самый сложный способ-сделать его родитель равным нулю (сделать вкладку одной без родителя):
tabPage.Parent = null;и когда вы хотите вернуть его обратно (вернуть его обратно в конце коллекции страниц) :
tabPage.Parent = tabControl;и если вы хотите вернуть его обратно в определенном месте среди страниц, которые вы можете использовать :
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
Я удалил вкладки в прошлом, чтобы пользователь не мог их щелкнуть. Это, вероятно, не лучшее решение, хотя, потому что они, возможно, потребуется, чтобы увидеть, что вкладка существует.
С помощью событий и свойств элемента управления tab вы можете включить/отключить то, что вы хотите, когда вы хотите. Я использовал один bool, который доступен для всех методов в классе дочерней формы mdi, где используется tabControl.
помните, что событие выбора срабатывает при каждом нажатии любой вкладки. Для большого количества вкладок "дело" может быть проще в использовании, чем куча ifs.
public partial class Form2 : Form { bool formComplete = false; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { formComplete = true; tabControl1.SelectTab(1); } private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { if (tabControl1.SelectedTab == tabControl1.TabPages[1]) { tabControl1.Enabled = false; if (formComplete) { MessageBox.Show("You will be taken to next tab"); tabControl1.SelectTab(1); } else { MessageBox.Show("Try completing form first"); tabControl1.SelectTab(0); } tabControl1.Enabled = true; } } }
Я решил эту проблему следующим образом: У меня есть 3 вкладки, и я хочу сохранить пользователя на первой вкладке, если он не вошел в систему, так что на SelectingEvent TabControl я написал
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
пользователь не может нажать на вкладки для навигации, но они могут использовать две кнопки (далее и назад). Пользователь не может перейти к следующему, если //условия не соблюдены.
private int currentTab = 0; private void frmOneTimeEntry_Load(object sender, EventArgs e) { tabMenu.Selecting += new TabControlCancelEventHandler(tabMenu_Selecting); } private void tabMenu_Selecting(object sender, TabControlCancelEventArgs e) { tabMenu.SelectTab(currentTab); } private void btnNextStep_Click(object sender, EventArgs e) { switch(tabMenu.SelectedIndex) { case 0: //if conditions met GoTo case 2: //if conditions met GoTo case n: //if conditions met GoTo { CanLeaveTab: currentTab++; tabMenu.SelectTab(tabMenu.SelectedIndex + 1); if (tabMenu.SelectedIndex == 3) btnNextStep.Enabled = false; if (btnBackStep.Enabled == false) btnBackStep.Enabled = true; CannotLeaveTab: ; } private void btnBackStep_Click(object sender, EventArgs e) { currentTab--; tabMenu.SelectTab(tabMenu.SelectedIndex - 1); if (tabMenu.SelectedIndex == 0) btnBackStep.Enabled = false; if (btnNextStep.Enabled == false) btnNextStep.Enabled = true; }
ответ rfnodulator для Vb.Net:
Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting e.Cancel = Not e.TabPage.Enabled End Sub
предположим, что у вас есть эти элементы:
TabControl с именем tcExemple.
вкладки с именами tpEx1 и tpEx2.
попробуй:
установить значение drawmode ваши новые, в OwnerDrawFixed; После InitializeComponent (), убедитесь, что tpEx2 не включен, добавив этот код:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;добавить к событию выбора tcExemple код ниже:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e) { if (!((Control)e.TabPage).Enabled) { e.Cancel = true; } }прикрепить к DrawItem событие tcExemple это код:
private void tcExemple_DrawItem(object sender, DrawItemEventArgs e) { TabPage page = tcExemple.TabPages[e.Index]; if (!((Control)page).Enabled) { using (SolidBrush brush = new SolidBrush(SystemColors.GrayText)) { e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds); } } else { using (SolidBrush brush = new SolidBrush(page.ForeColor)) { e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds); } } }это сделает вторую вкладку не кликабельной.
решение очень простое.
удалите/закомментируйте эту строку
this.tabControl.Controls.Add(this.YourTabName);in IntializeComponent() метод в MainForm.cs
Я не смог найти подходящего ответа на этот вопрос. Похоже, что нет решения для отключения конкретной вкладки. То, что я сделал, это передать конкретную вкладку переменной и в
SelectedIndexChangedсобытие верните его вSelectedIndex://variable for your specific tab int _TAB = 0; //here you specify your tab that you want to expose _TAB = 1; tabHolder.SelectedIndex = _TAB; private void tabHolder_SelectedIndexChanged(object sender, EventArgs e) { if (_TAB != 0) tabHolder.SelectedIndex = _TAB; }таким образом, вы на самом деле не отключаете вкладку, но когда нажимается другая вкладка, она всегда возвращает вас на выбранную вкладку.
использование:
tabControl1.TabPages[1].Enabled = false;при написании этого кода страница вкладки не будет полностью отключена (не имея возможности выбрать), но ее внутреннее содержимое будет отключено, что, я думаю, удовлетворит ваши потребности.
Comments