Як можна відключити вкладку всередині TabControl?


Відповіді:


71

Клас TabPage приховує властивість Enabled. Це було навмисно, оскільки з цим виникає незручна проблема дизайну інтерфейсу. Основна проблема полягає в тому, що вимкнення сторінки також не вимикає вкладку. І якщо спробувати обійти це, вимкнувши вкладку з подією Selecting, це не спрацює, коли TabControl має лише одну сторінку.

Якщо ці проблеми юзабіліті вас не стосуються, майте на увазі, що властивість все ще працює, вона просто прихована від IntelliSense. Якщо FUD незручний, ви можете просто зробити це:

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

3
Цікаво, що це за історія, через яку не можна перемикати видимість вкладки
Шашанк Шехар

91

Перекладіть свою TabPage на елемент керування, а потім встановіть для властивості Enabled значення false.

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

Тому заголовок вкладки все ще буде ввімкнено, але його вміст буде вимкнено.


3
Я думаю, що це втрачає сенс вимкнення самої вкладки. Користувач не повинен мати змоги вибрати його та переглянути вміст.
ThunderGr

3
Це може бути вашим випадком використання, але я вважаю це корисним, якщо вкладку потрібно лише для читання через деякі права.
Cédric Guillemette

9
Навіщо потрібно пониження TabPage для управління? Ми можемо викликати властивість Enabled з TabPage через поліморфізм.
Ельдар Агаларов

1
Не впевнений, чи було це коли-небудь інакше, але сьогодні це суцільна нісенітниця. 69 виборців неправильно. Ой ..
TaW

1
@TaW Це питання конкретно і коротко відповідає на питання. "Чи є спосіб вимкнути вкладку в системі керування вкладками?" Вони не питають, як сховати вкладку. 69 прихильників праворуч ... 1 коментатор, який неправильно прочитав питання. Ой ...
DDuffy

70

Ви можете просто використовувати:

tabPage.Enabled = false;

Ця властивість не відображається, але працює без проблем.

Ви можете запрограмувати подію Вибір, TabControlerщоб унеможливити перехід на нередаговану вкладку:

private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex < 0) return;
    e.Cancel = !e.TabPage.Enabled;
}

3
Як би дивно .. це, схоже, стосується і Visibleвласності, хоча, здавалося, це насправді не мало жодного візуального ефекту, коли я тестував його.
Alfie,

@Alfie Це тому, що TabPage успадковує наступну ієрархію: Control> ScrollableControl> Panel> TabPage, поведінка Enable, Visible тощо є поліморфною.
Майстер Йода

50

Ви можете зареєструвати подію "Вибір" та скасувати навігацію на вкладці:

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

Інша ідея полягає в тому, щоб розмістити всі елементи управління на вкладці в панелі керування та вимкнути панель! Смайлик

Ви також можете видалити вкладку із колекції tabControl1.TabPages. Це приховає вкладку.

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


Більш повний і пост, який я повинен був розмістити :)
Martijn Laarman

Це криваво блискуче рішення !!
Корнелій

13

Імовірно, ви хочете бачити вкладку в елементі керування вкладками, але ви хочете, щоб вона була "вимкнена" (тобто сірою та неможливо вибрати). Для цього немає вбудованої підтримки, але ви можете замінити механізм малювання, щоб надати бажаний ефект.

Приклад того, як це зробити, наведено тут .

Магія полягає в цьому фрагменті з представленого джерела та в методі DisableTab_DrawItem:

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

1
Приклад посилання тепер здається мертвим.
Narthring

1
@Narthring - Дякую, я замінив посилання на робоче.
Стюарт

2
@Narthring Знову мертвий.
Sukasa

Це «справжня» відповідь на це питання. Існує запис мертвого посилання з waybackmachine: [ web.archive.org/web/20131102065816/http://… .
Джо Урен

Одне вдосконалення цієї відповіді ... додайте обробник подій EnabledChanged на кожну з ваших вкладок і запропонуйте обробнику подій викликати Invalidate () на вкладці-керуванні. Таким чином, колір тексту оновлюється автоматично.
улатех

12

Продовжуючи відповідь Седріка Гіллемета, після того, як ви відключите Control:

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

... тоді ви можете обробляти подію TabControl' Selectingяк:

private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = !((Control)e.TabPage).Enabled;
}

8

Це призведе до видалення сторінки вкладки, але вам потрібно буде повторно додати її, коли вона вам буде потрібна:

tabControl1.Controls.Remove(tabPage2);

Якщо він вам знадобиться пізніше, можливо, ви захочете зберегти його на тимчасовій вкладці перед видаленням, а потім повторно додати при необхідності.


Я вважаю, що це чудово працює, коли ви хочете перевірити, у випадку завантаження форми, чи користувач має право отримати доступ до цієї вкладки, а якщо ні, просто видаліть її взагалі.
ThunderGr


2

Найбільш хитрий спосіб - зробити його батьків рівним нулю (зробити вкладку самостійно без батьків):

 tabPage.Parent = null;

І коли ви захочете повернути його назад (поверне його назад у кінці збору сторінок):

tabPage.Parent = tabControl;

І якщо ви хочете повернути його назад у певному місці серед сторінок, ви можете використовувати:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

1
Це працює добре! :) .. У мене одне питання. Коли ми повертаємо його назад до tabcontrol, додаємо остаточний індекс. Як додати вкладку з тим самим індексом з початкового етапу.
Користувач6667769

2
Якщо ви хочете повернути його назад у потрібне вам місце (не в кінці), використовуйте: tabControl.TabPages.Insert (indexLocationYouWant, tabPage);
Амр Ашраф,

1
Дякуємо за відповідь @Amr Ashraf
User6667769

1

Мені довелося з цим впоратися деякий час назад. Я видалив вкладку з колекції TabPages (я думаю, що це все) і додав її назад, коли змінилися умови. Але це було лише в Winforms, де я міг тримати вкладку, доки мені це знову не знадобиться.


1

Ви можете зробити це через вкладки: tabPage1.Hide (), tabPage2.Show () тощо.


2
Я використовував його у Windows Ce 6.0 з .net compact framework 3.5, і він працював. Питання не дає жодного поняття про платформу. Де вам це потрібно, веб, настільний чи мобільний?
aldebaran


0

Раніше я видаляв вкладки, щоб користувач не міг їх клацати. Це, мабуть, не найкраще рішення, оскільки їм може знадобитися побачити, що сторінка вкладки існує.


0

Використовуючи події та властивості елемента керування вкладками, ви можете вмикати / вимикати те, що потрібно, коли хочете. Я використав один файл bool, який доступний для всіх методів у класі дочірньої форми mdi, де використовується tabControl.

Пам'ятайте, що подія вибору спрацьовує кожного разу, коли клацається будь-яка вкладка. Для великої кількості вкладок "CASE" може бути простішим у використанні, ніж купа вбудованих.

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

0

Я вирішив цю проблему наступним чином: у мене є 3 вкладки, і я хочу залишити користувача на першій вкладці, якщо він не ввійшов, тому на SelectingEvent в TabControl я писав

if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }

0

Користувач не може натискати вкладки для навігації, але він може використовувати дві кнопки ( 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;
}

0

Припустимо, що у вас є такі елементи керування:

TabControl з назвою tcExemple.

TabPages з іменами tpEx1 та tpEx2.

Спробуй це:

Встановіть для DrawMode вашої TabPage значення 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 tcПриклад цього коду:

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

Це зробить другу вкладку неможливою клікання.


0

Це старе запитання, але хтось може отримати вигоду від мого додавання. Мені потрібен був TabControl, який би послідовно показував приховані вкладки (після виконання дії на поточній вкладці). Отже, я створив швидкий клас для успадкування та закликав HideSuccessive () на Load:

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

0

в C # 7.0 є нова функція, яка називається Pattern Matching . Ви можете вимкнути всі вкладки за допомогою Шаблон типу .

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

-1

У випадку завантаження форми, якщо ми пишемо this.tabpage.PageEnabled = false, вкладка буде вимкнена.


Не бачу цього майна
Джон,

будь ласка, перевірте, чи ви пробували це у випадку завантаження форми?
Новий

Просто перевірили вдвічі. Не бачу.
Джон

будь ласка, перевірте, чи використовували ви це: private void XtraForm1_Load (відправник об’єкта, EventArgs e) {this.xtraTabPage1.PageEnabled = false; } XtraForm1 є DevExpress XtraForm і TabPage xtraTabPage є DevExpress XtraTabpage
Новий

Чому ви нічого не сказали про DevExpress у своїй оригінальній відповіді ...?
Джон

-1

Використання:

 tabControl1.TabPages[1].Enabled = false;

Написавши цей код, сторінка вкладки не буде повністю вимкнена (неможливо вибрати), але її внутрішній вміст буде вимкнено, що, на мою думку, задовольняє ваші потреби.


-1

Рішення дуже просте.

Видалити / прокоментувати цей рядок

this.tabControl.Controls.Add(this.YourTabName);

у методі IntializeComponent () у MainForm.cs


-1

Я не зміг знайти відповідну відповідь на запитання. Здається, рішення для вимкнення певної вкладки не існує. Те, що я зробив, це передати конкретну вкладку змінній і в 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;
}

Отже, ви фактично не вимикаєте вкладку, але коли натискається інша вкладка, вона завжди повертає вас до вибраної вкладки.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.