Несколько вкладок в одном окне windows forms

Последнее обновление: 31.10.2015

Последнее обновление: 31.10.2015

TabControl

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

Чтобы настроить вкладки элемента TabControl используем свойство TabPages. При переносе элемента TabControl с панели инструментов на форму
по умолчанию создаются две вкладки — tabPage1 и tabPage2. Изменим их отображение с помощью свойства TabPages:

Свойство TabPages

Нам откроется окно редактирования/добавления и удаления вкладок:

Изменение вкладок

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

Управление вкладками в коде

Для добавления новой вкладки нам надо ее создать и добавить в коллекцию tabControl1.TabPages с помощью метода Add:

//добавление вкладки
TabPage newTabPage = new TabPage();
newTabPage.Text = "Континенты";
tabControl1.TabPages.Add(newTabPage);

Удаление так же просто:

// удаление вкладки
// по индексу
tabControl1.TabPages.RemoveAt(0);
// по объекту
tabControl1.TabPages.Remove(newTabPage);

Получая в коллекции tabControl1.TabPages нужную вкладку по индексу, мы можем ей легко манипулировать:

// изменение свойств
tabControl1.TabPages[0].Text = "Первая вкладка";

SplitContainer

Элемент SplitContainer позволяет создавать две разделенные сплитером панели. Изменяя положение сплитера, можно изменить размеры этих панелей.

Элемент SplitContainer

Используя свойство Orientation, можно задать горизонтальное или вертикальное отображение сплитера на форму. В данном случае
это свойство принимает значения Horisontal и Vertical соответственно.

В случае, когда надо запретить изменение положения сплиттера, то можно присвоить свойству IsSplitterFixed значение true.
Таким образом, сплитер окажется фиксированным, и мы не сможем поменять его положение.

По умолчанию при растяжении формы или ее сужении также будет меняться размер обеих панелей сплитконтейнера. Однако мы можем закрепить за одной панелью
фиксированную ширину (при вертикальной ориентации сплиттера) или высоту (при горизонтальной ориентации сплиттера). Для этого нам надо установить у элемента
SplitContainer свойство FixedPanel. В качестве значения оно принимает панель, которую надо зафиксировать:

Фиксированная панель в SplitContainer

Чтобы изменить положение сплитера в коде, мы можем управлять свойством SplitterDistance, которое задает положение сплиттера в пикселях
от левого или верхнего края элемента SplitContainer. А с помощью свойства SplitterIncrement можно задать шаг, на который будет
перемещаться сплиттер при движении его с помощью клавиш-стрелок.

Чтобы скрыть одну из двух панелей, мы можем установить свойство Panel1Collapsed или Panel2Collapsed в
true

Windows TabControl is a useful control that allows you display multiple dialogs tabs on a single form by switching between the tabs. A tab acts as another Form that can host other controls. Figure 1 shows an example of TabControl in Visual Studio .NET, which allows you to switch among multiple files using the tabs.

In this tutorial, I will explain how to create and use a TabControl in your Windows applications with C#.

Adding a TabControl to Form

The simplest way to create a TabControl is using Visual Studio .NET. I create a Windows Form application using Visual Studio .NET and add a TabControl from Toolbox to the Form by dragging the TabControl to the Form. After that I resize and reposition TabControl according to the Form size. The Form Designer adds the code for TabControl for you. If you see the code, you will notice once private variable of type System.Windows.Forms.TabControl as following:

  1. private System.Windows.Forms.TabControl tabControl1;  

The System.Windows.Forms.TabControl class represents a TabControl in .NET. Now if you see the InitializeComponent method generated by the Form Designer, you will see the code for TabControl such as setting TabControl location, name, size and adding the TabControl to the Form controls. See Listing 1.

  1. private void InitializeComponent()  
  2. {  
  3.     this.tabControl1 = new System.Windows.Forms.TabControl();  
  4.     this.SuspendLayout();  
  5.       
  6.       
  7.       
  8.     this.tabControl1.Location = new System.Drawing.Point(8, 16);  
  9.     this.tabControl1.Name = «tabControl1»;  
  10.     this.tabControl1.SelectedIndex = 0;  
  11.     this.tabControl1.Size = new System.Drawing.Size(352, 248);  
  12.     this.tabControl1.TabIndex = 0;  
  13.       
  14.       
  15.       
  16.     this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);  
  17.     this.ClientSize = new System.Drawing.Size(368, 273);  
  18.     this.Controls.Add(this.tabControl1);  
  19.     this.Name = «Form1»;  
  20.     this.Text = «Form1»;  
  21.     this.ResumeLayout(false);  
  22. }

Figure 1 shows an example 

Understanding the TabControl and TabPage class 

A TabControl is a collection of tab pages and a tab page is the actual control that hosts other child controls. TabPage class represents a tab page.

TabControl class represents a TabControl. This class provides members (properties, methods, and events) to work with the TabControls. Table 1 lists the TabControl properties.

Property  Description
Alignment Area of the control where the tabs are aligned.
Appearance Visual appearance of the control’s tabs.
DrawMode A way that the control’s tab pages are drawn.
HotTrack Value indicating whether the control’s tabs change in appearance when the mouse passes over them.
ImageList The images to display on the control’s tabs.
ItemSize Size of the control’s tabs.
Multiline A value indicating whether more than one row of tabs can be displayed.
Padding Amount of space around each item on the control’s tab pages. 
RowCount Returns the number of rows that are currently being displayed in the control’s tab strip.
SelectedIndex The index of the currently-selected tab page.
SelectedTab  Currently selected tab page.
ShowToolTips The value indicating whether a tab’s ToolTip is shown when the mouse passes over the tab.
SizeMode The way that the control’s tabs are sized.
TabCount Number of tabs in the tab strip.
TabPages Returns the collection of tab pages in this tab control.

Adding TabPage to a TabControl

Now I will add few tabs to the TabControl with the help of Properties window of TabControl. The Properties window has a property called TabPages, which is a collection of TabPage controls (see Figure 2). A TabPage represents a page of the TabControl that can host child controls.

Figure 2. TabPages property of TabControl

Now if you click on TabPages property in Property window, it launches TabPage Collection Editor (see Figure 3) where you can add a new page or remove existing pages by using Add and Remove buttons. You can also set the properties of pages by using the right side properties grid. As you can see from Figure 3, I add two pages and set their properties. 

Figure 3. Adding Tab pages to a TabControl

After adding two pages to TabControl, the final Form looks like Figure 4.

Figure 4. A Form with two Tab pages

Adding and Removing a TabPage to TabControl Programmatically

You can add and remove Tab pages to a TabControl using the TabControl.TabPages.Add and TabControl.TabPages.Remove methods. The following code snippet adds a new page to the TabControl programmatically:

  1. TabPage newPage = new TabPage(«New Page»);  
  2. tabControl1.TabPages.Add(newPage);  

After adding the page, the new TabControl would look like Figure 5.

Figure 5. Adding a Tab page programmatically.

The Remove method of TabPageCollection class (through TabControl.TabPages) removes a page by name or index from the page collection. The following code snippet removes «New Page» from the collection:

  1. TabPage newPage = new TabPage(«New Page»);  
  2. tabControl1.TabPages.Remove(newPage);  

The RemoveAll method removes all the pages from the collection.

Adding Controls to a TabPage

Adding controls to a TabPage is similar to adding controls to a Form. Make a page active in the Form Designer and drag and drop controls from Toolbox to the page. I add a Label, a TextBox, and a Button control to Settings page of TabControl and change their properties. The final page looks like Figure 6.

Figure 6. Adding controls to a Tab page

Controls are added to a page by using TabPage.Controls.Add method. Now if you see the code generated by the designer, you will notice the following code:

  1. this.SettingsPage.Controls.Add(this.BrowseBtn);  
  2. this.SettingsPage.Controls.Add(this.textBox1);  
  3. this.SettingsPage.Controls.Add(this.label1);  

Using the same code, you can even add controls to a TabPage programmatically.

Access Controls of a TabPage

All controls of a TabPage are local to a Form and accessible from the Form without adding any additional functionality. For example, the following code sets the Text property of the TextBox on Preferences Tab page:

  1. this.textBox1 =@«C:»;  

Getting and Setting Active Tab Programmatically

You can get and set an active tab of a TabControl programmatically using the SelectedTab property of TabControl. For example, the following code snippet sets PreferencePage as active tab:

  1. this.tabControl1.SelectedTab = this.PreferencesPage; 

Элемент
управления TabControl
(Windows Forms) используется для отображения
нескольких вкладок, аналогичных
разделителям в записной книжке или
меткам в наборе папок картотечного
блока.

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

Наиболее
важным свойством элемента управления
TabControl
является свойство TabPages,
содержащее отдельные вкладки. Каждая
вкладка представляет собой объект
TabPage.
Если перейти на вкладку, вызывается
событие Click
для соответствующего объекта TabPage.

Создание
вкладок

Чтобы
создать несколько вкладок выполните
следующие действия:

  1. Выберите
    в Панели элементов на вкладке Контейнеры
    элемент управления TabControl
    и добавьте
    его на форму. В результате будет создан
    элемент управления TabControl
    с двумя вкладками TabPage1
    и TabPage2.

  2. Выделите
    одну из вкладок. Перейдите в окно
    Свойства и измените наименование
    вкладки в свойстве Text.

Изменение
внешнего вида элемента управления
TabControl

Внешний
вид вкладок в формах Windows Forms может быть
изменен при помощи свойств элемента
управления TabControl
и объектов TabPage,
представляющих отдельные вкладки в
составе элемента управления. Настройка
этих свойств позволяет отображать
рисунки на вкладках, располагать вкладки
вертикально, размещать их в несколько
рядов, а также включать и выключать
вкладки программными средствами.

Чтобы отобразить
значок в области надписей на вкладке

  1. Добавьте
    элемент управления ImageList
    в форму.

  2. Добавьте
    изображение в список изображений.

  3. Задайте
    для свойства ImageList
    элемента управления TabControl
    значение ImageList.

  4. Присвойте
    свойству ImageIndex
    объекта TabPage
    значение индекса соответствующего
    изображения из списка.

В
результате рядом с именами вкладок
появятся иконки:

Чтобы добавить новую вкладку:

  1. Откройте
    панель Задачи, щелкнув по символу
    треугольника в верхнем правом углу
    элемента управления TabControl.

  2. Выберите
    команду Добавить вкладку.

Чтобы создать
несколько рядов вкладок:

  1. Добавьте
    требуемое количество страниц вкладок.

  2. Присвойте
    свойству Multiline
    элемента TabControl
    значение true.

  3. Если
    вкладки еще не отображены в несколько
    рядов, уменьшите значение свойства
    Width
    элемента управления TabControl
    так, чтобы оно стало меньше общей ширины
    всех вкладок.

Чтобы расположить
вкладки вдоль края элемента управления

Присвойте
свойству Alignment
элемента управления TabControl
значение Left
или Right.

Чтобы включить
или выключить вкладку программными
средствами

Присвойте
свойству Enabled
объекта TabPage
значение true
или false.

tabPage1.Enabled
=
false;

Чтобы отобразить
вкладки в виде кнопок

Присвойте
свойству Appearance
элемента управления TabControl
значение Buttons
или FlatButtons.

В
некоторых ситуациях бывает необходимо
ограничить доступ к данным, доступным
в приложении Windows Forms. Например, при
отображении данных на вкладках может
возникнуть необходимость запретить
гостевым пользователям и пользователям
нижнего уровня доступ к содержимому
одной из вкладок.

Чтобы
отключить страницы вкладок программными
средствами

  1. Напишите
    код для обработки события SelectedIndexChanged
    элемента управления вкладок. Данное
    событие происходит при переключении
    пользователя на очередную вкладку.

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

  3. Если
    учетные данные соответствуют требованиям,
    отобразите нужную вкладку. Если учетные
    данные не соответствуют требованиям,
    отобразите диалоговое окно или другой
    элемент пользовательского интерфейса,
    содержащий сообщение об отсутствии
    требуемых прав доступа, и задайте
    страницам вкладок значение свойства
    Enabled
    равным false.

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

  1. Если
    страниц вкладок больше двух, можно
    отобразить вкладку, отличающуюся от
    первоначальной.

В
приведенном ниже примере вместо проверки
учетных данных используется элемент
управления CheckBox,
поскольку условия доступа к вкладке
будут изменяться в зависимости от
приложения. Если при распознавании
события SelectedIndexChanged
проверка учетных данных прошла успешно
(т. е. флажок установлен) и выбрана вкладка
TabPage2
(в данном примере — вкладка с
конфиденциальными данными), то вкладка
TabPage2
отображается. В противном случае
отображается вкладка TabPage3
и открывается окно с сообщением об
отсутствии необходимых прав доступа.
Нижеследующий код предполагает наличие
формы, в которой имеется элемент
управления CheckBox
и элемент управления TabControl
с тремя страницами вкладок.

private void
tabControl1_SelectedIndexChanged(object sender, System.EventArgs e)

{ if
((CheckBox1.Checked
= true) & (tabControl1.SelectedTab == tabPage2))

{
tabControl1.SelectedTab = tabPage2;

}

else if
((CredentialCheck.Checked = false) & (tabControl1.SelectedTab ==
tabPage2))

{
MessageBox.Show(«Unable to load tab.
You
have insufficient access privileges.»);

tabControl1.SelectedTab
= tabPage3; }
}

Добавление
элемента управления на вкладку
программными средствами

Элемент
управления TabControl
конструктора Windows Forms можно использовать
для упорядочения отображения других
элементов управления. В следующей
процедуре показано, как отображать
рисунок в основной части вкладки.

Чтобы
добавить элемент управления программными
средствами, выполните следующие действия:
используйте
метод Add
коллекции, возвращаемой свойством
Controls
элемента управления TabPage:

tabPage1.Controls.Add(new
Button());

либо

tabPage1.get_Controls().Add(new
Button());

Добавление
и удаление вкладок с помощью элемента
управления TabControl в Windows Forms программными
средствами

По
умолчанию элемент управления TabControl
содержит два элемента управления
TabPage.
Доступ к этим вкладкам возможен
посредством свойства TabPages.

Чтобы
добавить вкладки программными средствами
используйте
метод Add
свойства TabPages.

string title = «TabPage
» + (tabControl1.TabCount + 1).ToString();

TabPage myTabPage = new
TabPage(title);

tabControl1.TabPages.Add(myTabPage);

Удаление
вкладки программными средствами

Чтобы
удалить выбранные вкладки используйте:

  • метод
    Remove
    свойства TabPages
    для удаления
    одной заданной вкладки.

либо

  • метод
    Clear
    свойства TabPages
    для удаления всех вкладок.

tabControl1.TabPages.Remove(tabControl1.SelectedTab);

tabControl1.TabPages.Clear();

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

43 / 11 / 3

Регистрация: 16.12.2008

Сообщений: 107

1

Создание нескольких вкладок в форме

26.02.2011, 15:37. Показов 13103. Ответов 6


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

Или подскажите, как сделать так, чтобы при нажатии на кнопку форма расширялась и появлялась таблица. Это, вроде, полегче организовать

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



386 / 375 / 22

Регистрация: 08.02.2011

Сообщений: 1,078

26.02.2011, 16:01

2

Цитата
Сообщение от Napster
Посмотреть сообщение

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

tabcontrol тебе в помощь.

Добавлено через 18 минут
Вообще зачем так все сложно? создай mdb прикрути к нему 2 грайда на разных вкладках, на одном сделай выборку показ всего, а на втором только нужного.

Добавлено через 1 минуту
Не дочитал, у тебя даже еще проще, чем я сказал.



1



43 / 11 / 3

Регистрация: 16.12.2008

Сообщений: 107

26.02.2011, 16:17

 [ТС]

3

Вообще зачем так все сложно? создай mdb прикрути к нему 2 грайда на разных вкладках, на одном сделай выборку показ всего, а на втором только нужного.

Не понял, если честно..

а как вызвать другую tabpage через нажатие клавиши?
И опять же, как сделать автоматом обновление datagridview при заходе на эту tabpage?
т.е. я ввел некоторые данные, зашел на другую вкладку. потом обратно, ввел еще некоторую информацию, зашел на вкладку с таблицей, а информация там не обновилась…



0



386 / 375 / 22

Регистрация: 08.02.2011

Сообщений: 1,078

26.02.2011, 17:40

4

Цитата
Сообщение от Napster
Посмотреть сообщение

Не понял, если честно..

а как вызвать другую tabpage через нажатие клавиши?
И опять же, как сделать автоматом обновление datagridview при заходе на эту tabpage?
т.е. я ввел некоторые данные, зашел на другую вкладку. потом обратно, ввел еще некоторую информацию, зашел на вкладку с таблицей, а информация там не обновилась…

Ты выложи конкретное задание. Базу данных акцесса говорю прикрути вместо массивов.



0



43 / 11 / 3

Регистрация: 16.12.2008

Сообщений: 107

26.02.2011, 17:47

 [ТС]

5

У меня нету бд аксесса. я все в arraylist храню.

задание, грубо говоря, я уже написал.
мне нужно сделать автоматическое добавление строк в datagridview после того, как я ввел нужную информацию в текстбоксы.
у меня же информация перестает обновляться после одного перехода на вкладку с таблицей.
//
upd. Сделал обновление просто тупым способом. При записи в ArrayList я сразу же присваиваю таблице нужные значения. Надо было только убрать DataSource.



0



_Лёша_

386 / 375 / 22

Регистрация: 08.02.2011

Сообщений: 1,078

26.02.2011, 18:17

6

Цитата
Сообщение от Napster
Посмотреть сообщение

У меня нету бд аксесса. я все в arraylist храню.

задание, грубо говоря, я уже написал.
мне нужно сделать автоматическое добавление строк в datagridview после того, как я ввел нужную информацию в текстбоксы.
у меня же информация перестает обновляться после одного перехода на вкладку с таблицей.
//
upd. Сделал обновление просто тупым способом. При записи в ArrayList я сразу же присваиваю таблице нужные значения. Надо было только убрать DataSource.

Ты не поверишь, я в своей проге сейчас застрял на аналогичной проблеме, как только найду как, то отпишусь , а может тебе лучше использовать listview, с ним проще:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim i as Integer
 Do Until LV.Items.Count = 0  
            LV.Items(0).Remove() 'Удаление старых записей
           
        Loop
        i = 0
 
                
   Do While Чтение.Peek() <> -1
   LV.Items.Add(Чтение.ReadLine)
   LV.Items(i).SubItems.Add(Чтение.ReadLine) 
   LV.Items(i).SubItems.Add(Чтение.ReadLine)            
   LV.Items(i).SubItems.Add(Чтение.ReadLine) 
 
           i = i +1
                   Loop

ну переделаешь под свое если надо

Добавлено через 16 минут
Все, догадался

VB.NET
1
2
3
    With Me.datagridview1.Rows
            .Add("Столбец1","столбец2","столбец3")'и так далее
        End With



0



0 / 0 / 1

Регистрация: 17.05.2013

Сообщений: 15

09.06.2013, 18:31

7

Цитата
Сообщение от Napster
Посмотреть сообщение

В общем идея такая: нужно создать несколько страниц в одной форме (наподобие того, как это делается с открытыми страницами в браузерах).

Это через родительскую форму MDI делается?



0



Случилось недавно так, что понадобилось в одном проекте использовать компонент TabControl. Стандартный компонент, ничего необычного, достаточно удобный. Нюанс заключался в том, что нужно было использовать свой тип вкладок на основе перегруженного TabPage. Кроме этого, необходимо было позволить пользователю добавлять вкладки самому в процессе работы. Выглядеть оно должно было примерно так:
image

Радует, что стандартные компоненты позволяют делать с ними достаточно много извращений.

Линк на тестовый проект с примером. Под

2011

2010 студию.

Начнем с кастомного типа вкладок.
К сожалению, TabControl, в отличие от DataGridViewColumn, не позволяет указывать тип вложенного элемента через внутреннюю переменную. Так это делается в DataGridViewColumn:


        public class CustomDataGridViewColumn : DataGridViewTextBoxColumn
        {
            public CustomDataGridViewColumn()
            {
                this->CellTemplate = CustomDataGridViewCell;
            }
        }

Проект должен быть изменен под Net 4 Full profile, т.к. нужно подключать две сборки — System.Design и System.Drawing.Design.

Увы, сделать аналогично в TabControl не получится, придется переопределять тип TabPageCollection, объявленный внутри TabControl. Итак, объявляем сам класс и необходимые методы, далее разберем по очереди. Да, и сразу предупрежу — внутри файла с кодом не было строчки «using System.Windows.Forms;», поэтому обращение к стандартным компонентам в коде примера идет с приставкой «System.Windows.Forms.». А TabControl и TabPage это кастомные переопределенные типы.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Drawing.Design;
using System.ComponentModel.Design;

namespace WindowsFormsApplication1
{
    public class TabControl : System.Windows.Forms.TabControl
    {
        //Объявляем новый тип коллекции вкладок. 
        public new class TabPageCollection : System.Windows.Forms.TabControl.TabPageCollection
        {
            public TabPageCollection(TabControl owner)
                : base(owner)
            {

            }
        }

        public TabControl()
        {

        }

        private TabPageCollection mTabCollection = null;

        //Переопределяем свойство для доступа к коллекции вкладок, указывая в атрибуте Editor тип редактора коллекции.
        [Editor(typeof(TabPageCollectionEditor), typeof(UITypeEditor))]
        public new System.Windows.Forms.TabControl.TabPageCollection TabPages
        {
            get
            {
                if (mTabCollection == null) mTabCollection = new TabPageCollection(this);
                return mTabCollection;
            }
        }
    }

    //Редактор коллекции вкладок тоже пришлось переопределять. В нем всего два перегруженных метода.
    public class TabPageCollectionEditor : System.ComponentModel.Design.CollectionEditor
    {
        public TabPageCollectionEditor(Type type)
            : base(type)
        {

        }

        protected override Type CreateCollectionItemType()
        {
            return typeof(TabPage);
        }

        protected override Type[] CreateNewItemTypes()
        {
            return new Type[] { typeof(TabPage) };
        }
    }
}

И простенький TabPage:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication1
{
    public class TabPage : System.Windows.Forms.TabPage
    {
        public TabPage()
        {

        }
    }
}

Думаю, тут все понятно. Переходим к следующему этапу.

Добавление вкладок пользователем.
Для обеспечения этой возможности мы пошли самым простым путем: в TabControl постоянно присутствует дополнительная пустая вкладка с заголовком «+». При её нажатии генерируется событие добавления вкладки.

Во-первых, в типе TabPageCollection перегружаем метод Clear — при очищении вкладок нам НЕ надо удалять вкладку «+».


            public override void Clear()
            {
                System.Windows.Forms.TabPage page = null;
                if (this.ContainsKey(TabControl.KeyPageAllowAddName)) page = this[TabControl.KeyPageAllowAddName];

                base.Clear();

                if (page != null) this.Add(page);
            }

В коде TabControl объявляем переменную, которая хранит имя вкладки «+».


        public static string KeyPageAllowAddName = "___page_allow_to_add_name___";

Объявляем свойство AllowUserToAddTab компонента для того чтобы можно было включать/отключать новый режим работы. Ну и собственно метод, проверяющий наличие такой вкладки и в случае необходимости добавляющий/удаляющий её.


        public TabControl()
        {
            this.Enter += new EventHandler((sender, e) => { CheckAllowUserToAddTab(); });
            this.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(TabControl_Selecting);
        }

        private bool mAllowUserToAddTab = false;
        [Browsable(true), Description("Позволяет пользователю добавлять вкладки. Добавляется элемент +, по щелчку на который создается событие OnUserAddedTab."), Category("Action")]
        public virtual bool AllowUserToAddTab
        {
            get { return mAllowUserToAddTab; }
            set { mAllowUserToAddTab = value; }
        }

       void CheckAllowUserToAddTab()
        {
            if (mAllowUserToAddTab)
            {
                System.Windows.Forms.TabPage page_allow_to_add = TabPages[KeyPageAllowAddName];

                if (mAllowUserToAddTab)
                {
                    if (page_allow_to_add == null)
                    {
                        page_allow_to_add = new TabPage();
                        page_allow_to_add.Name = KeyPageAllowAddName;
                        page_allow_to_add.Text = "+";
                        TabPages.Insert(0, page_allow_to_add);
                    }
                }
                else
                {
                    if (page_allow_to_add != null) TabPages.Remove(page_allow_to_add);
                }
            }
        }

Описываем делегат для события добавления вкладки:


    public delegate bool TabPageAdding(TabControl control, TabPage page);

Событие и метод для добавления вкладки:


        public event TabPageAdding PageAdding;
        void TabControl_Selecting(object sender, System.Windows.Forms.TabControlCancelEventArgs e)
        {
            if (TabPages.Count > 0 && e.TabPage.Name == KeyPageAllowAddName)
            {
                e.Cancel = true;

                TabPage page = new TabPage();
                if (PageAdding != null)
                    foreach (TabPageAdding _delegate in PageAdding.GetInvocationList())
                    {
                        try
                        {
                            if (!_delegate.Invoke(this, page)) return;
                        }
                        catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); }
                    }

                TabPages.Add(page);
            }
        }

Перебирается список всех подписчиков на событие добавления, если хоть один из них вернет False — добавление отменяется.

В классе TabPageCollectionEditor надо перегрузить методы GetItems и SetItems. Они нужны для передачи массива вкладок из редактора в компонент и обратно, при этом надо исключать вкладку «+».


        protected override object[] GetItems(object editValue)
        {
            try
            {
                object[] values = base.GetItems(editValue);
                List<object> values2 = new List<object>();
                foreach (var element in values)
                {
                    if (element.GetType() == typeof(TabPage))
                    {
                        TabPage tp = (TabPage)element;
                        if (tp.Name == TabControl.KeyPageAllowAddName) continue;
                    }
                    values2.Add(element);
                }
                return values2.ToArray();
            }
            catch (Exception ex){System.Windows.Forms.MessageBox.Show(ex.Message);}
            return base.GetItems(editValue);
        }

        protected override object SetItems(object editValue, object[] value)
        {
            try
            {
                List<object> values2 = new List<object>();
                foreach (var element in value)
                {
                    if (element.GetType() == typeof(TabPage))
                    {
                        TabPage tp = (TabPage)element;
                        if (tp.Name == TabControl.KeyPageAllowAddName) continue;
                    }
                    values2.Add(element);
                }
                return base.SetItems(editValue, values2.ToArray());
            }
            catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); }
            return base.SetItems(editValue, value);
        }

Далее добавили еще одну возможность: отслеживание первого открытия вкладки (по первому заходу на вкладку инициализировались формочки)

Тут добавляется еще одно событие, список и обработчик событий SelectedIndexChanged/Enter/Click:


        public TabControl()
        {
            this.Enter += new EventHandler(TabControl_PageEvent);
            this.Click += new EventHandler(TabControl_PageEvent);
            this.SelectedIndexChanged += new EventHandler(TabControl_PageEvent);

            this.Enter += new EventHandler((sender, e) => { CheckAllowUserToAddTab(); });
            this.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(TabControl_Selecting);
        }

        ....

        private Dictionary<System.Windows.Forms.TabPage, bool> mLoaded = new Dictionary<System.Windows.Forms.TabPage, bool>();
        public delegate void TabPageLoadedEventHandler(TabControl control, System.Windows.Forms.TabPage page);
        public event TabPageLoadedEventHandler PageLoad;
        void TabControl_PageEvent(object sender, EventArgs e)
        {
                if (this.SelectedTab != null && !mLoaded.ContainsKey(this.SelectedTab))
                {
                    mLoaded.Add(this.SelectedTab, true);
                    if (PageLoad != null) PageLoad(this, this.SelectedTab);
                }
        }

Конечно, дорабатывать тут еще можно много чего — например, в TabPageControlCollection перегружать методы для более точного определения номера вкладки (чтобы исключать вкладку «+»).
К сожалению, я не нашел способа реализовать функциональность вкладки «+» через перегрузку методов отрисовки компонента, так что не обессудьте за кривой способ. Имхо как альтернатива установке DevExpress, например — сойдет.

Собственно, давно задался этим вопросом, но ответ найти не смог.
Если на одной форме нужно, чтобы на одном и том же месте отображались различные панели (типа как TabControl без визуализируемых табов), как это следует грамотно реализовывать? Интересуют грамотные реализации на WinForms и WPF.


До этого использовал только в WinForms в следующих вариациях:

Скачивал с нета пользовательский элемент управления, наследованный от tabcontrol, в котором перехватывалось какое-то событие, и вкладки не визуализировались. В дальнейшем переключение вкладок велось через иные элементы управления.

Накладывал друг на друга панели, и периодически менял у них визибилити. Гемор ещё тот.

Denis's user avatar

Denis

8,84010 золотых знаков29 серебряных знаков54 бронзовых знака

задан 6 июн 2013 в 19:22

svinopapka's user avatar

Насчёт WinForms не скажу, а для WPF есть, как правильно отмечает @Spawn, миллион разных решений, от переключения видимости до рестайлинга ItemsControl‘а. Выберите то, которое подходит лучше к семантике вашей задачи.

Я, например, часто пользуюсь таким решением: определяю просто

<ContentPresenter Content="{Binding VM}"/>

и подменяю VM, когда нужно. Отображение VM задаётся, понятно, через DataTemplate.

ответ дан 6 июн 2013 в 19:47

VladD's user avatar

VladDVladD

205k27 золотых знаков284 серебряных знака516 бронзовых знаков

3

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

Для WinForms посмотрите, например, такой пример.

А для WPF есть такое более ли менее стандартное решение.

ответ дан 6 июн 2013 в 19:36

Spawn's user avatar

SpawnSpawn

2,50810 серебряных знаков19 бронзовых знаков

2

Рассскажу, как делал это когда-то для WinForms. Сразу предупрежу, что это все то же переключение visibility у n-ного количества панелей, наложенных друг на друга. В качестве переключателей используются RadioButton’ы. Каждый RadioButton знает, какую панель он должен показать (можно, например, сохранить ссылку на необходимую панель в свойство Tag). Также сохранена ссылка на панель, которая показывается в текущий момент. Тогда примерный код обработчика радиокнопки будет таким:

private Panel selectedPanel;  // Ссылка на активную панель

...

private void SelectPanel(object sender, EventArgs e)
{
    var radioButton = sender as RadioButton;
    if (radioButton != null && radioButton.Checked)
    {
        if (selectedPanel != null)
            selectedPanel.Hide();

        selectedPanel = radioButton.Tag as Panel;

        if (selectedPanel != null)
            selectedPanel.Show();
    }
}

По-моему, не такой уж и гемор, если учесть, что больше кода не нужно. Но есть неудобство при работе с этой «стопкой» панелей в дизайнере форм.

ответ дан 6 июн 2013 в 20:46

Shad's user avatar

ShadShad

3,43318 серебряных знаков22 бронзовых знака

1

Насчет winForms — есть такая штука как GroupBox, и скрыв ее — скроешь все дочерние элементы, как по мне самое оно.

ответ дан 7 июн 2013 в 2:43

Зуев Владимир's user avatar

Зуев ВладимирЗуев Владимир

4053 серебряных знака16 бронзовых знаков

ответ дан 31 мар 2016 в 16:01

MaximK's user avatar

MaximKMaximK

2,65114 серебряных знаков28 бронзовых знаков

System Properties
I need something like this, the image list several tabs each when clicked takes you to its respective form within the window, I just need the look and feel of something like this.
But instead of stacking tabs horizontally I need them stacked up vertically. I just need 3 multiple forms in 3 different tabs. I want the basic look and feel like the System Properties window when you right click My ComputerProperties.

asked Feb 15, 2012 at 7:28

gaganHR's user avatar

gaganHRgaganHR

3272 gold badges7 silver badges19 bronze badges

5

The TabControl has a property called ‘Alignment’ with four possible enum-values (Top, Left, Right, Bottom). By default the value is set to Top but if you set it to Left, the tabs will appear on the left side of the TabControl.

YourTabControl.Alignment = TabAlignment.Left;

answered Feb 15, 2012 at 8:21

Abbas's user avatar

AbbasAbbas

14k6 gold badges41 silver badges71 bronze badges

2

System Properties
I need something like this, the image list several tabs each when clicked takes you to its respective form within the window, I just need the look and feel of something like this.
But instead of stacking tabs horizontally I need them stacked up vertically. I just need 3 multiple forms in 3 different tabs. I want the basic look and feel like the System Properties window when you right click My ComputerProperties.

asked Feb 15, 2012 at 7:28

gaganHR's user avatar

gaganHRgaganHR

3272 gold badges7 silver badges19 bronze badges

5

The TabControl has a property called ‘Alignment’ with four possible enum-values (Top, Left, Right, Bottom). By default the value is set to Top but if you set it to Left, the tabs will appear on the left side of the TabControl.

YourTabControl.Alignment = TabAlignment.Left;

answered Feb 15, 2012 at 8:21

Abbas's user avatar

AbbasAbbas

14k6 gold badges41 silver badges71 bronze badges

2

Like this post? Please share to your friends:
  • Несколько видеокарт в одном компьютере windows 10
  • Нет bluetooth в панели управления windows 7
  • Нет bluetooth в диспетчере устройств на windows 10
  • Нет bitlocker в windows 10 home
  • Несколько версий java на одном компьютере windows