5.8. Контейнеры

Контейнеры — это компоненты, на поверхности которых вы можете располагать другие элементы управления. Смысловой нагрузки с точки зрения программирования в них мало, тут в основном нас интересуют возможности оформления и группировки других компонентов.

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

5.8.1. GroupBox

Раз уж мы затронули тему группировки компонентов RadioButton, то следует сразу посмотреть на компонент GroupBox, который решает эту задачу очень хорошо. Пример компонента можно увидеть на рис. 5.20. У компонента есть свойство Text, которое отвечает за текст, отображаемый в заголовке группы. По краю компонента идет контур, чтобы пользователь видел границы компонента.

Рис. 5.20. Использование компонента GroupBox

На поверхности компонента вы можете расположить свою группу компонентов RadioButton, и они будут работать независимо.

5.8.2. Panel

Наверное, это самый популярный контейнер, который программисты используют для оформления и группировки, — у него нет никакого текста, да и не нужно ему ничего.

Создайте новое приложение и поместите на форму панель. Установите у нее свойство Dock на Left, чтобы панель вытянулась вдоль левого края окна. Теперь поместите на форму (именно на форму, а не на панель) компонент RichTextBox и у него измените свойство Dock на Fill, чтобы компонент влился во всю оставшуюся область окна. Внутри панели слева можно располагать какие-то элементы управления, с помощью которых пользователь будет работать с RichTextBox.

5.8.3. TabControl

Смысл компонента — те же панели, которые можно переключать с помощью вкладок (Tab), расположенных вверху компонента. Создайте приложение и перетащите на него компонент TabControl. По умолчанию будет создан компонент с двумя страницами с именами tabPage1 и tabPage2.

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

Сами страницы класса TabPage практически не отличаются по свойствам от панелей, только имеют свойство Text, которое хранит заголовок страницы. Есть еще свойство ToolTopText, в котором можно указать текст подсказки для страницы.

Компонент TabControl немного интереснее, и у него есть полезные свойства:

  • HotTrack — вкладки будут изменять свое оформление (как бы подсвечиваться), когда вы наводите на них курсор мыши;
  • Multiline — заголовки вкладок могут располагаться в несколько строк, если они не помещаются в одну строку;
  • ShowToolTips — отображать подсказки страниц;
  • TabIndex — индекс активной страницы;
  • TabPages — в этом свойстве находится коллекция страниц.

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

Чтобы не держать в памяти необходимость вернуться на первую страницу, можно переключиться в код и после вызова метода InitializeComponent() в конструкторе формы прописать установку индекса активной вкладки:

   public Form1()
   {
     InitializeComponent();
     tabControl1.TabIndex = 0; // явно установить индекс вкладки
   }

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

5.8.4. FlowLayoutPanel и TableLayoutPanel

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

Компонент TableLayoutPanel выравнивает компоненты в виде таблицы. В свойствах ColumnCount и RowCount вы можете указать количество колонок и строк в таблице соответственно.

Свойства Columns и Rows — это коллекции, в которых находятся параметры колонок и строк. Выделите свойство Columns или Rows и вызовите его редактор (рис. 5.21). Его окно не просто одинаковое для обоих свойств, это одно и то же окно, просто вверху окна есть выпадающий список Show, в котором вы можете выбирать, что именно сейчас отображать — параметры строк или колонок.

Рис. 5.21. Редактор свойств колонок и строк

Выделяя строку или колонку в левом списке, справа вы можете задать ее размер в абсолютных значениях (Absolute) или в относительных (Percent). Если размер не имеет значения, то можно выбрать AutoSize, чтобы система пропорционально поделила пространство. Слева внизу есть кнопки для добавления в конец списка, удаления и вставки в текущую позицию новой строки/колонки.

У табличной панели есть еще одно интересное свойство: GrowStyle, которое определяет, в какую сторону должна расти таблица, когда вы добавляете новую ячейку в момент, когда все ячейки заняты. По умолчанию стоит значение AddRows, т. е. в таблице будет добавлена новая строка. Можно также указать AddColumns, чтобы добавлялась колонка, или FixesSize — нельзя добавлять новую ячейку.

Это бесплатная глава книги Библия C#. В новом издании эта глава переписана с учетом универсальных при-ложений Windows, а старая версия главы, которая не потеряла еще своей актуаль-ности стала бесплатной и доступной всем.

Все исходные коды главы 5 Библии C#

Предыдущая глава

5.7. Общие компоненты Часть 2

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

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

Пишите мне