




Преобразуйте TabPage в элемент управления, затем установите для свойства Enabled значение false.
((Control)this.tabPage).Enabled = false;
Следовательно, заголовок вкладки по-прежнему будет включен, но его содержимое будет отключено.
Я думаю, что это упускает момент отключения самой вкладки. Предполагается, что пользователь не может выбирать его и просматривать содержимое.
Это может быть ваш вариант использования, но я думаю, что это полезно, если вкладка должна быть доступна только для чтения из-за некоторых прав.
Зачем нужно понижать значение TabPage для управления? Мы можем вызвать свойство Enabled из TabPage из-за полиморфизма.
Не уверен, было ли когда-нибудь иначе, но сегодня это полная чушь. 69 проголосовавших ошиблись. Ой ..
@TaW Этот вопрос конкретно и лаконично отвечает на вопрос. "Есть ли способ отключить вкладку в элементе управления вкладками?" Они не спрашивают, как скрыть вкладку. 69 проголосовавших справа ... 1 комментатор, который не прочитал вопрос неправильно. Ой ...
Нет. Гипс был и не нужен. И, конечно же, TabPage вообще не отключен: его можно выбрать.
Если вы вытащите аккумулятор из машины, значит, вы его отключили. Вы все еще можете видеть это, вы все еще можете потрогать его, вы просто не можете его использовать. Отключение и скрытие - две разные вещи.
Класс TabPage скрывает свойство Enabled. Это было сделано намеренно, поскольку с этим связана неудобная проблема дизайна пользовательского интерфейса. Основная проблема заключается в том, что отключение страницы не приводит к отключению вкладки. И если попытаться обойти это, отключив вкладку с событием Selecting, это не сработает, если TabControl имеет только одну страницу.
Если эти проблемы с удобством использования вас не беспокоят, имейте в виду, что свойство все еще работает, оно просто скрыто от IntelliSense. Если FUD неудобен, вы можете просто сделать это:
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
Интересно, какова предыстория запрета переключения видимости вкладок
Единственный способ - поймать событие Selecting и предотвратить активацию вкладки.
Раньше я удалял вкладки, чтобы пользователь не нажимал на них. Это, вероятно, не лучшее решение, потому что им может потребоваться увидеть, что страница вкладки существует.
Вы можете зарегистрировать событие «Выбор» и отменить переход на вкладку:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
Другая идея - поместить все элементы управления на вкладку в элементе управления Panel и отключить панель! Смайлик
Вы также можете удалить вкладку из коллекции tabControl1.TabPages. Это скроет вкладку.
Кредиты идут на littleguru @ Channel 9.
Более полный и пост, который я должен был опубликовать :)
Это чертовски блестящее решение !!
Некоторое время назад мне пришлось справиться с этим. Я удалил вкладку из коллекции TabPages (думаю, что это так) и добавил ее обратно, когда условия изменились. Но это было только в Winforms, где я мог держать вкладку до тех пор, пока она мне снова не понадобится.
Предположительно, вы хотите видеть вкладку в элементе управления вкладками, но хотите, чтобы она была «отключена» (т. Е. Выделена серым цветом и недоступна для выбора). Для этого нет встроенной поддержки, но вы можете переопределить механизм рисования, чтобы получить желаемый эффект.
Пример того, как это сделать - предоставлено здесь.
Магия заключается в этом фрагменте из представленного источника и в методе DisableTab_DrawItem:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
Ссылка на пример теперь кажется мертвой.
@Narthring - Спасибо, заменил ссылку на рабочую.
@Narthring Он снова мертв.
Это «настоящий» ответ на этот вопрос. Есть запись о неработающей ссылке с waybackmachine: [web.archive.org/web/20131102065816/http://….
Одно улучшение этого ответа ... добавьте обработчик событий EnabledChanged на каждую из ваших вкладок и пусть обработчик событий вызывает Недействительный () на элементе управления вкладками. Таким образом, цвет текста будет обновляться автоматически.
MyTabControl.SelectedTab.Enabled = false;
Это приведет к удалению страницы вкладки, но вам нужно будет снова добавить ее, когда она вам понадобится:
tabControl1.Controls.Remove(tabPage2);
Если он вам понадобится позже, вы можете сохранить его на временной вкладке перед удалением, а затем повторно добавить его при необходимости.
Я думаю, он отлично работает, когда вы хотите проверить в событии Load формы, имеет ли пользователь право доступа к этой вкладке, а если нет, просто удалите ее вообще.
Используя события и свойства элемента управления вкладкой, вы можете включать / отключать то, что вы хотите, когда хотите. Я использовал один bool, доступный для всех методов в классе дочерней формы mdi, где используется tabControl.
Помните, что событие выбора запускается каждый раз при нажатии любой вкладки. Для большого количества вкладок использовать CASE может быть проще, чем набор if.
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;
}
}
}
Продолжение ответа Седрика Гийометта после отключения Control:
((Control)this.tabPage).Enabled = false;
... затем вы можете обработать событие TabControlSelecting как:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
Вы можете просто использовать:
tabPage.Enabled = false;
Это свойство не отображается, но работает без проблем.
Вы можете запрограммировать событие выбора на TabControler, чтобы сделать невозможным переход на нередактируемую вкладку:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
Как странно ... это также похоже на свойство Visible, хотя, когда я его тестировал, на самом деле не было никакого визуального эффекта.
@Alfie Это потому, что TabPage наследуется от следующей иерархии: Control> ScrollableControl> Panel> TabPage, поведение Enable, Visible и т. д. Является полиморфным.
Вы можете сделать это через вкладки: tabPage1.Hide (), tabPage2.Show () и т. д.
Я использовал его в Windows CE 6.0 с .net compact framework 3.5, и он работал. Вопрос ничего не говорит о платформе. Где вам это нужно: в Интернете, на компьютере или на мобильном устройстве?
Пользователь не может щелкать вкладки для навигации, но может использовать две кнопки (Next и Back). Пользователь не может перейти к следующему, // если условия не выполнены.
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;
}
В событии загрузки формы, если мы напишем this.tabpage.PageEnabled = false, закладка будет отключена.
Невозможно увидеть это свойство
проверьте пожалуйста, пробовали ли вы это в событии загрузки формы?
Только что дважды проверил сейчас. Не вижу.
проверьте, использовали ли вы это: private void XtraForm1_Load (объект-отправитель, EventArgs e) {this.xtraTabPage1.PageEnabled = false; } XtraForm1 - это DevExpress XtraForm, а вкладка xtraTabPage - это DevExpress XtraTabpage
Почему вы ничего не сказали о DevExpress в своем первоначальном ответе ...?
Я решил эту проблему так: У меня есть 3 вкладки, и я хочу, чтобы пользователь оставался на первой вкладке, если он не вошел в систему, поэтому в SelectingEvent для TabControl я написал
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
Использовать:
tabControl1.TabPages[1].Enabled = false;
При написании этого кода страница вкладки не будет полностью отключена (не может быть выбрана), но ее внутреннее содержимое будет отключено, что, как я думаю, удовлетворит ваши потребности.
tabControl.TabPages.Remove (tabPage1);
Самый сложный способ - сделать его родительский элемент равным нулю (сделать вкладку только без родителя):
tabPage.Parent = null;
И когда вы захотите вернуть его обратно (вернете обратно в конце коллекции страниц):
tabPage.Parent = tabControl;
И если вы хотите вернуть его обратно в определенное место среди страниц, которые вы можете использовать:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
Работает хорошо! :)..У меня есть один вопрос. Когда мы вернем его обратно в tabcontrol, добавим последний index. Как добавить вкладку с тем же индексом, что и на начальном этапе.
Если вы хотите вернуть его обратно в нужное место (не в конец), используйте: tabControl.TabPages.Insert (indexLocationYouWant, tabPage);
Спасибо за ответ @Amr Ashraf
Предположим, что у вас есть эти элементы управления:
TabControl с именем tcExemple.
TabPages с именами tpEx1 и tpEx2.
Попытайся:
Установите DrawMode вашей TabPage на OwnerDrawFixed; После InitializeComponent () убедитесь, что tpEx2 не включен, добавив этот код:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
Добавьте в событие Selection 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);
в методе 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;
}
Таким образом, вы фактически не отключаете вкладку, но при нажатии на другую вкладку она всегда возвращает вас на выбранную вкладку.
Это старый вопрос, но мое добавление может кому-то пригодиться. Мне нужен TabControl, который бы последовательно отображал скрытые вкладки (после выполнения действия на текущей вкладке). Итак, я сделал быстрый класс для наследования и вызвал HideSuccessive () при загрузке:
public class RevealingTabControl : TabControl
{
private Action _showNextRequested = delegate { };
public void HideSuccessive()
{
var tabPages = this.TabPages.Cast<TabPage>().Skip(1);
var queue = new ConcurrentQueue<TabPage>(tabPages);
tabPages.ToList().ForEach(t => t.Parent = null);
_showNextRequested = () =>
{
if (queue.TryDequeue(out TabPage tabPage))
tabPage.Parent = this;
};
}
public void ShowNext() => _showNextRequested();
}
в C# 7.0 есть новая функция под названием Соответствие шаблону. Вы можете отключить все вкладки через Тип шаблона.
foreach (Control control in Controls)
{
// the is expression tests the variable and
// assigned it to a new appropriate variable type
if (control is TabControl tabs)
{
tabs.Enabled = false;
}
}
Я бы либо удалил вкладку, либо заменил ее содержимое объяснением ...