Подтвердить что ты не робот

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

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

Я использую С#.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Вы можете просто использовать:

tabPage.Enabled = false;

Это свойство не отображается, но оно работает без проблем.

Вы можете запрограммировать событие "Выбор" на TabControler, чтобы сделать невозможным переход на вкладку, не редактируемую:

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

Ответ 4

Вы можете зарегистрировать событие "Выбор" и отменить навигацию на вкладке:

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

Еще одна идея - поместить все элементы управления на вкладке в панели управления и отключить панель! Smiley

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

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

Ответ 5

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

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

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

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

Ответ 6

Расширение ответа Cédric Guillemette после отключения Control:

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

... вы можете обрабатывать событие TabControl Selecting как:

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

Ответ 7

Это приведет к удалению закладки, но вам нужно будет ее повторно добавить, когда вам это нужно:

tabControl1.Controls.Remove(tabPage2);

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

tabControl.TabPages.Remove(tabPage1);

Ответ 12

Самый сложный способ - сделать свой родитель равным null (сделать вкладку самостоятельно без родителя):

 tabPage.Parent = null;

И когда вы хотите вернуть его обратно (вернет его в конце коллекции страниц):

tabPage.Parent = tabControl;

И если вы хотите вернуть его обратно в определенном месте среди страниц, которые вы можете использовать:

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

Ответ 13

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

Ответ 14

Используя события и свойства элемента управления вкладкой, вы можете включить/отключить то, что хотите, когда захотите. Я использовал один bool, который доступен для всех методов в классе дочерних форм mdi, где используется tabControl.

Помните, что событие выбора срабатывает при каждом нажатии любой вкладки. Для большого количества вкладок "CASE" может быть проще в использовании, чем пучок 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;
            }
        }
    }

Ответ 15

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

Ответ 16

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

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

Ответ 17

Ответ rfnodulator для Vb.Net:

Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
        e.Cancel = Not e.TabPage.Enabled
End Sub

Ответ 18

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

TabControl с именем tcExemple.

TabPages с именами 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);
            }
        }
    }

Это сделает вторую вкладку неаккуратной.

Ответ 19

В событии загрузки формы, если мы пишем this.tabpage.PageEnabled = false, вкладка будет отключена.

Ответ 20

Использование:

 tabControl1.TabPages[1].Enabled = false;

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

Ответ 21

MyTabControl.SelectedTab.Enabled = false;