Как динамически отобразить одну из двух вкладок Winforms? - PullRequest
1 голос
/ 08 марта 2009

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

Какой самый простой способ добиться этого? Я попытался настроить две разные вкладки и использовать что-то вроде tab.Enabled / Visible - но не смог найти такие атрибуты на вкладках.

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

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

Связанное решение неоправданно сложно для того, что вы хотите сделать. Вот фрагмент кода, который делает то, что вы хотите. Он основан на форме с 3 или более вкладками. Предположим, что в любой момент времени вы хотите, чтобы отображалась либо вкладка 2, либо вкладка 3, но не обе одновременно. Если в форме есть больше вкладок, они отображаются после вкладок 2 или 3, поэтому ваша чередующаяся вкладка всегда будет отображаться в одной и той же позиции указателя. Также предположим, что на вкладке 1 есть пара переключателей с именами «tab2button» и «tab3button», которые переключают, какая из вкладок отображается. Событие checkaged для переключателей будет содержать следующее (c ++):

             if (this->tab2button->Checked)
             {
                 if(tabControl1->TabPages->Contains(tabPage3))
                 {
                     tabControl1->TabPages->Remove(tabPage3);
                 }
                 if(!tabControl1->TabPages->Contains(tabPage2))
                 {
                     tabControl1->TabPages->Insert(1,tabPage2);
                 }

             }
             else if (this->tab3button->Checked)
             {
                 if(tabControl1->TabPages->Contains(tabPage2))
                 {
                     tabControl1->TabPages->Remove(tabPage2);
                 }
                 if(!tabControl1->TabPages->Contains(tabPage3))
                 {
                     tabControl1->TabPages->Insert(1,tabPage3);
                 }
             }
2 голосов
/ 08 марта 2009
1 голос
/ 09 февраля 2010

Не могу поверить, что не нашел правильного решения для чего-то такого простого. Я знаю, что в прошлом я показывал и скрывал вкладки.

tabControl.SelectTab (индекс);

Бинго! Без удаления, без вставки и без перетасовки.

-Holt

1 голос
/ 11 марта 2009

Я не знаю элегантного решения. Самым простым для небольшого приложения кажется TabPages.Add / Insert / Remove, как предложено выше.

В нашем большом приложении мы переопределяем TabControl и класс TabPage - называем их MyTabControl и MyTabPage - и добавляем наше собственное свойство Visible. Установка tabPage.Visible = false заставляет страницу вкладки удалять себя из коллекции tabControl.TabPages. Если сделать страницу видимой снова, она будет вставлена ​​в коллекцию элемента управления вкладками с исходным индексом. Свойство Visible сделало управление остальным кодом немного проще.

Однако подклассы сделали наш подкласс MyTabControl немного сложнее для разработки. TabControl.TabPages является коллекцией TabPageCollection. Дизайнер Visual Studio хочет создать и добавить к нему TabPages. Нам нужно, чтобы он содержал наши подклассы MyTabPage, поэтому мы также создали MyTabPageCollection.

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

...