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



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



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

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 ' s Selecting событие:

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

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

tabControl1.Controls.Remove(tabPage2);

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

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

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

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

tabControl.Вкладки.Удалить(tabPage1);

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

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

таким образом, вы на самом деле не отключаете вкладку, но когда нажимается другая вкладка, она всегда возвращает вас на выбранную вкладку.

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

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

 tabControl1.TabPages[1].Enabled = false;

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

MyTabControl.SelectedTab.Enabled = false;

Comments

    Ничего не найдено.