Чи є спосіб вимкнути вкладку в TabControl ?
Чи є спосіб вимкнути вкладку в TabControl ?
Відповіді:
Клас TabPage приховує властивість Enabled. Це було навмисно, оскільки з цим виникає незручна проблема дизайну інтерфейсу. Основна проблема полягає в тому, що вимкнення сторінки також не вимикає вкладку. І якщо спробувати обійти це, вимкнувши вкладку з подією Selecting, це не спрацює, коли TabControl має лише одну сторінку.
Якщо ці проблеми юзабіліті вас не стосуються, майте на увазі, що властивість все ще працює, вона просто прихована від IntelliSense. Якщо FUD незручний, ви можете просто зробити це:
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
Перекладіть свою TabPage на елемент керування, а потім встановіть для властивості 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;
}
Visible
власності, хоча, здавалося, це насправді не мало жодного візуального ефекту, коли я тестував його.
Ви можете зареєструвати подію "Вибір" та скасувати навігацію на вкладці:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
Інша ідея полягає в тому, щоб розмістити всі елементи управління на вкладці в панелі керування та вимкнути панель! Смайлик
Ви також можете видалити вкладку із колекції tabControl1.TabPages. Це приховає вкладку.
Кредити йдуть на littleguru @ 9 Channel .
Імовірно, ви хочете бачити вкладку в елементі керування вкладками, але ви хочете, щоб вона була "вимкнена" (тобто сірою та неможливо вибрати). Для цього немає вбудованої підтримки, але ви можете замінити механізм малювання, щоб надати бажаний ефект.
Приклад того, як це зробити, наведено тут .
Магія полягає в цьому фрагменті з представленого джерела та в методі DisableTab_DrawItem:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
Продовжуючи відповідь Седріка Гіллемета, після того, як ви відключите Control
:
((Control)this.tabPage).Enabled = false;
... тоді ви можете обробляти подію TabControl
' Selecting
як:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
Це призведе до видалення сторінки вкладки, але вам потрібно буде повторно додати її, коли вона вам буде потрібна:
tabControl1.Controls.Remove(tabPage2);
Якщо він вам знадобиться пізніше, можливо, ви захочете зберегти його на тимчасовій вкладці перед видаленням, а потім повторно додати при необхідності.
Єдиний спосіб - зловити Selecting
подію та не допустити активації вкладки.
Найбільш хитрий спосіб - зробити його батьків рівним нулю (зробити вкладку самостійно без батьків):
tabPage.Parent = null;
І коли ви захочете повернути його назад (поверне його назад у кінці збору сторінок):
tabPage.Parent = tabControl;
І якщо ви хочете повернути його назад у певному місці серед сторінок, ви можете використовувати:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
Ви можете зробити це через вкладки: tabPage1.Hide (), tabPage2.Show () тощо.
tabControl.TabPages.Remove (tabPage1);
Раніше я видаляв вкладки, щоб користувач не міг їх клацати. Це, мабуть, не найкраще рішення, оскільки їм може знадобитися побачити, що сторінка вкладки існує.
Використовуючи події та властивості елемента керування вкладками, ви можете вмикати / вимикати те, що потрібно, коли хочете. Я використав один файл 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;
}
}
}
Користувач не може натискати вкладки для навігації, але він може використовувати дві кнопки ( 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;
}
Припустимо, що у вас є такі елементи керування:
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);
}
}
}
Це зробить другу вкладку неможливою клікання.
Це старе запитання, але хтось може отримати вигоду від мого додавання. Мені потрібен був 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();
}
в 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;
}
}
У випадку завантаження форми, якщо ми пишемо this.tabpage.PageEnabled = false
, вкладка буде вимкнена.
Рішення дуже просте.
Видалити / прокоментувати цей рядок
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;
}
Отже, ви фактично не вимикаєте вкладку, але коли натискається інша вкладка, вона завжди повертає вас до вибраної вкладки.