Как отключить вкладку внутри TabControl?

Есть ли способ отключить вкладку в TabControl?

Я бы либо удалил вкладку, либо заменил ее содержимое объяснением ...

Phil1970 28.11.2016 23:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
85
1
185 828
24
Перейти к ответу Данный вопрос помечен как решенный

Ответы 24

Преобразуйте TabPage в элемент управления, затем установите для свойства Enabled значение false.

((Control)this.tabPage).Enabled = false;

Следовательно, заголовок вкладки по-прежнему будет включен, но его содержимое будет отключено.

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

ThunderGr 19.10.2012 14:18

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

Cédric Guillemette 29.11.2012 17:27

Зачем нужно понижать значение TabPage для управления? Мы можем вызвать свойство Enabled из TabPage из-за полиморфизма.

Eldar Agalarov 13.08.2013 02:44

Не уверен, было ли когда-нибудь иначе, но сегодня это полная чушь. 69 проголосовавших ошиблись. Ой ..

TaW 26.05.2016 16:03

@TaW Этот вопрос конкретно и лаконично отвечает на вопрос. "Есть ли способ отключить вкладку в элементе управления вкладками?" Они не спрашивают, как скрыть вкладку. 69 проголосовавших справа ... 1 комментатор, который не прочитал вопрос неправильно. Ой ...

DDuffy 02.06.2016 15:24

Нет. Гипс был и не нужен. И, конечно же, TabPage вообще не отключен: его можно выбрать.

TaW 02.06.2016 16:21

Если вы вытащите аккумулятор из машины, значит, вы его отключили. Вы все еще можете видеть это, вы все еще можете потрогать его, вы просто не можете его использовать. Отключение и скрытие - две разные вещи.

DDuffy 08.09.2016 14:37
Ответ принят как подходящий

Класс TabPage скрывает свойство Enabled. Это было сделано намеренно, поскольку с этим связана неудобная проблема дизайна пользовательского интерфейса. Основная проблема заключается в том, что отключение страницы не приводит к отключению вкладки. И если попытаться обойти это, отключив вкладку с событием Selecting, это не сработает, если TabControl имеет только одну страницу.

Если эти проблемы с удобством использования вас не беспокоят, имейте в виду, что свойство все еще работает, оно просто скрыто от IntelliSense. Если FUD неудобен, вы можете просто сделать это:

public static void EnableTab(TabPage page, bool enable) {
    foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}

Интересно, какова предыстория запрета переключения видимости вкладок

Shashank Shekhar 29.05.2015 21:25

Единственный способ - поймать событие Selecting и предотвратить активацию вкладки.

Раньше я удалял вкладки, чтобы пользователь не нажимал на них. Это, вероятно, не лучшее решение, потому что им может потребоваться увидеть, что страница вкладки существует.

Вы можете зарегистрировать событие «Выбор» и отменить переход на вкладку:

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPage == tabPage2)
        e.Cancel = true;
}

Другая идея - поместить все элементы управления на вкладку в элементе управления Panel и отключить панель! Смайлик

Вы также можете удалить вкладку из коллекции tabControl1.TabPages. Это скроет вкладку.

Кредиты идут на littleguru @ Channel 9.

Более полный и пост, который я должен был опубликовать :)

Martijn Laarman 06.01.2009 23:56

Это чертовски блестящее решение !!

Cornelius 10.11.2014 21:36

Некоторое время назад мне пришлось справиться с этим. Я удалил вкладку из коллекции TabPages (думаю, что это так) и добавил ее обратно, когда условия изменились. Но это было только в Winforms, где я мог держать вкладку до тех пор, пока она мне снова не понадобится.

Предположительно, вы хотите видеть вкладку в элементе управления вкладками, но хотите, чтобы она была «отключена» (т. Е. Выделена серым цветом и недоступна для выбора). Для этого нет встроенной поддержки, но вы можете переопределить механизм рисования, чтобы получить желаемый эффект.

Пример того, как это сделать - предоставлено здесь.

Магия заключается в этом фрагменте из представленного источника и в методе DisableTab_DrawItem:

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );

Ссылка на пример теперь кажется мертвой.

Narthring 01.11.2012 20:29

@Narthring - Спасибо, заменил ссылку на рабочую.

Stewart 07.11.2012 18:21

@Narthring Он снова мертв.

Sukasa 22.02.2014 01:32

Это «настоящий» ответ на этот вопрос. Есть запись о неработающей ссылке с waybackmachine: [web.archive.org/web/20131102065816/http://….

Joe Uhren 16.01.2015 06:56

Одно улучшение этого ответа ... добавьте обработчик событий EnabledChanged на каждую из ваших вкладок и пусть обработчик событий вызывает Недействительный () на элементе управления вкладками. Таким образом, цвет текста будет обновляться автоматически.

ulatekh 19.06.2018 23:40
MyTabControl.SelectedTab.Enabled = false;

Это приведет к удалению страницы вкладки, но вам нужно будет снова добавить ее, когда она вам понадобится:

tabControl1.Controls.Remove(tabPage2);

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

Я думаю, он отлично работает, когда вы хотите проверить в событии Load формы, имеет ли пользователь право доступа к этой вкладке, а если нет, просто удалите ее вообще.

ThunderGr 19.10.2012 14:14

Используя события и свойства элемента управления вкладкой, вы можете включать / отключать то, что вы хотите, когда хотите. Я использовал один 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 16.09.2013 16:13

@Alfie Это потому, что TabPage наследуется от следующей иерархии: Control> ScrollableControl> Panel> TabPage, поведение Enable, Visible и т. д. Является полиморфным.

Master Yoda 28.04.2015 17:46

Вы можете сделать это через вкладки: tabPage1.Hide (), tabPage2.Show () и т. д.

Я использовал его в Windows CE 6.0 с .net compact framework 3.5, и он работал. Вопрос ничего не говорит о платформе. Где вам это нужно: в Интернете, на компьютере или на мобильном устройстве?

aldebaran 22.10.2013 15:14

Пользователь не может щелкать вкладки для навигации, но может использовать две кнопки (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, закладка будет отключена.

Невозможно увидеть это свойство

John 16.05.2015 14:38

проверьте пожалуйста, пробовали ли вы это в событии загрузки формы?

New 19.05.2015 08:08

Только что дважды проверил сейчас. Не вижу.

John 19.05.2015 11:26

проверьте, использовали ли вы это: private void XtraForm1_Load (объект-отправитель, EventArgs e) {this.xtraTabPage1.PageEnabled = false; } XtraForm1 - это DevExpress XtraForm, а вкладка xtraTabPage - это DevExpress XtraTabpage

New 20.05.2015 08:58

Почему вы ничего не сказали о DevExpress в своем первоначальном ответе ...?

John 20.05.2015 13:13

Я решил эту проблему так: У меня есть 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. Как добавить вкладку с тем же индексом, что и на начальном этапе.

User6667769 04.08.2017 11:35

Если вы хотите вернуть его обратно в нужное место (не в конец), используйте: tabControl.TabPages.Insert (indexLocationYouWant, tabPage);

Amr Ashraf 29.08.2017 12:50

Спасибо за ответ @Amr Ashraf

User6667769 29.08.2017 12:55

Предположим, что у вас есть эти элементы управления:

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

Другие вопросы по теме