Элементы выбора windows forms

Обновлено: 06.07.2024

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

В главной форме Form1 разместить:

  • элемент управления типа Label для вывода результата возврата из второстепенной формы;
  • элемент управления типа Button для вызова второстепенной формы.

Во второстепенной форме Form2 разместить:

  • элемент управления типа Label для вывода заголовка формы;
  • два элемента управления типа Button для обеспечения подтверждения или неподтверждения выбора (действия) во второстепенной форме.

Рис. 1. Схема взаимодействия между формами

Выполнение

1. Создать приложение типа Windows Forms Application

Запустить Microsoft Visual Studio 2010 . Пример создания нового приложения типа Windows Forms Application подробно описывается здесь.

Сохранить проект в произвольной папке.

Рис. 2. Главная форма приложения Form1

2. Разработка главной формы приложения

Из палитры элементов управления Toolbox выносим на форму:

  • элемент управления типа Button ;
  • элемент управления типа Label .

Рис. 3. Главная форма приложения после внесенных изменений

3. Создание второстепенной формы

Способ 1.
Для добавления формы №2 в проект этим способом нужно вызвать команду (рис. 4)

Рис. 5. Окно добавления новой формы к проекту

Способ 2.

Также новую форму можно добавить к проекту с помощью соответствующей команды из контекстного меню (рис. 7).
Последовательность действий следующая:

Рис. 7. Добавление новой формы из Solution Explorer

В результате откроется точно такое же окно как на рисунке 5.

4. Разработка второстепенной формы

Следующим шагом есть разработка второстепенной формы. Используя средства панели инструментов Toolbox создаем второстепенную форму Form2 как показано на рисунке 8. Такое построение формы соответствует условию задачи. Таким же образом, на Form2 имеем элементы управления label1 , butto1 , button2 .

Рис. 8. Второстепенная форма Form2

5. Программирование событий клика на кнопках OK и Cancel формы Form2

Программируем событие клика на кнопке OK . Подробный пример программирования события клика на кнопке OK описывается здесь.

6. Вызов формы Form2 из главной формы приложения

Программный код обработчика события будет иметь следующий вид:

В листинге, приведенном выше, сначала создается экземпляр класса типа Form2 . В операторе условного перехода if осуществляется вызов диалогового окна формы Form2 с помощью строки

Листинг всего программного кода формы Form1 следующий

7. Выполнение приложения

После выполненных действий можно выполнять приложение и исследовать его работу.

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

В этом уроке вы узнаете

Основы Windows Forms

Приложение Windows Forms работает на настольном компьютере. Приложение форм Windows обычно имеет набор элементов управления, таких как метки, текстовые поля, списки и т. Д.

Итак, пример элементов управления, доступных в приведенном выше приложении

Теперь давайте рассмотрим пример того, как мы можем реализовать простое приложение «Hello World» в Visual Studio. Для этого нам нужно будет выполнить следующие шаги

Шаг 1) Первый шаг включает создание нового проекта в Visual Studio. После запуска Visual Studio вам нужно выбрать пункт меню New-> Project.

Если вышеуказанные шаги будут выполнены, вы получите следующий вывод в Visual Studio.

Вывод:-

Вы увидите конструктор форм, отображаемый в Visual Studio. Именно в этом конструкторе форм вы начнете создавать приложение Windows Forms.

В обозревателе решений вы также сможете увидеть решение DemoApplication. Это решение будет содержать ниже 2 файла проекта

  1. Приложение Form называется Forms1.cs. Этот файл будет содержать весь код приложения Windows Form.
  2. Основная программа с именем Program.cs является файлом кода по умолчанию, который создается при создании нового приложения в Visual Studio. Этот код будет содержать код запуска приложения в целом.

В левой части Visual Studio вы также увидите панель инструментов. Панель инструментов содержит все элементы управления, которые можно добавить в Windows Forms. Элементы управления, такие как текстовое поле или метка, являются лишь некоторыми из элементов управления, которые можно добавить в Windows Forms.

Ниже приведен скриншот того, как выглядит Панель инструментов.

Шаг 3) На этом этапе мы добавим в форму метку, которая будет отображать «Hello World». На панели инструментов вам нужно будет выбрать элемент управления Label и просто перетащить его на форму.

После того, как вы перетащите метку на форму, вы можете увидеть метку, встроенную в форму, как показано ниже.

Чтобы перейти к свойствам элемента управления, необходимо щелкнуть его правой кнопкой мыши и выбрать пункт меню «Свойства».

  • Панель свойств также отображается в Visual Studio. Таким образом, для элемента управления меткой в ​​элементе управления свойствами перейдите в раздел «Текст» и введите «Hello World».
  • Каждый элемент управления имеет набор свойств, которые описывают элемент управления.

Если вы выполните все вышеперечисленные шаги и запустите свою программу в Visual Studio, вы получите следующий вывод

Вывод:-

В выводе вы можете видеть, что форма Windows отображается. Вы также можете увидеть «Hello World» отображается в форме.

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

Мы уже видели, как добавить элемент управления в форму, когда добавили элемент управления меткой в ​​предыдущем разделе, чтобы отобразить «Hello World».

Давайте посмотрим на другие элементы управления, доступные для форм Windows, и рассмотрим некоторые их общие свойства.

В нашем примере мы создадим одну форму, которая будет иметь следующую функциональность.

Итак, давайте подробно рассмотрим каждый элемент управления и добавим их для построения формы с вышеупомянутой функциональностью.

Групповая коробка

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

Шаг 2) После того, как группа будет добавлена, перейдите в окно свойств, нажав на элемент управления группы. В окне свойств перейдите к свойству Text и измените его на «Сведения о пользователе».

После внесения вышеуказанных изменений вы увидите следующий вывод

Вывод:-

В выводе вы можете четко видеть, что Groupbox был добавлен в форму. Вы также можете видеть, что текст группового блока был изменен на «Сведения о пользователе».

Контроль над этикетками

Шаг 2) После добавления метки перейдите в окно свойств, щелкнув элемент управления меткой. В окне свойств перейдите к свойству Text каждого элемента управления label.

После внесения вышеуказанных изменений вы увидите следующий вывод

Вывод:-

Вы можете видеть элементы управления надписью, добавленные в форму.

Текстовое окно

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

После внесения вышеуказанных изменений вы увидите следующий вывод

Вывод:-

На выходе вы можете четко видеть, что текстовые поля были добавлены в форму.

Список

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

Шаг 2) После того, как список был добавлен, перейдите в окно свойств, нажав на элемент управления списка.

  1. Сначала измените свойство элемента управления Listbox, в нашем случае мы изменили его на lstCity
  2. Нажмите на свойство Items. Это позволит вам добавлять различные элементы, которые могут отображаться в списке. В нашем случае мы выбрали элементы «коллекция».
  3. В появившемся всплывающем редакторе коллекции строк введите названия городов. В нашем случае мы ввели «Мумбаи», «Бангалор» и «Хайдарабад».
  4. Наконец, нажмите кнопку «ОК».

После внесения вышеуказанных изменений вы увидите следующий вывод

Вывод:-

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

Переключатель

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

Шаг 2) После добавления радиокнопки перейдите в окно свойств, щелкнув элемент управления радиокнопки.

  1. Во-первых, вам нужно изменить свойство текста обоих элементов управления Radio. Перейдите в окно свойств и измените текст на мужской радиобутон, а на другой женский.
  2. Аналогичным образом измените свойство name обоих элементов управления Radio. Перейдите в окно свойств и измените имя на «rdMale» одной радиокнопки и на «rdfemale» для другой.

Как только вы сделаете вышеуказанные изменения, вы увидите следующий вывод

Вывод:-

Вы увидите переключатели, добавленные в форму Windows.

флажок

Шаг 2) После того, как флажок был добавлен, перейдите в окно свойств, нажав на элемент управления флажок.

После внесения вышеуказанных изменений вы увидите следующий вывод

Вывод:-

кнопка

Шаг 2) После добавления кнопки перейдите в окно свойств, нажав на элемент управления Button.

После внесения вышеуказанных изменений вы увидите следующий вывод

Вывод:-

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

Обычно, когда кнопка нажимается на форме, это означает, что должна выполняться некоторая обработка.

Давайте посмотрим на одно из событий и как оно может быть обработано, прежде чем мы перейдем к сценарию события кнопки.

Шаг 1) Дважды щелкните по списку в конструкторе форм . Делая это, Visual Studio автоматически откроет файл кода для формы. И он автоматически добавит метод события в код. Этот метод события будет запускаться всякий раз, когда выбран какой-либо элемент в списке.

Выше приведен фрагмент кода, который автоматически добавляется Visual Studio при двойном щелчке элемента управления «Список» на форме. Теперь давайте добавим приведенный ниже фрагмент кода в этот фрагмент кода, чтобы добавить необходимые функции в событие списка.

Как только вы внесете вышеуказанные изменения и запустите программу в Visual Studio, вы увидите следующий вывод

Вывод:-

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

  1. Это метод обработчика событий, который автоматически создается Visual Studio при двойном щелчке по кнопке управления. Вам не нужно беспокоиться о сложности имени метода или параметров, передаваемых в метод.
  2. Здесь мы получаем значения, введенные в текстовое поле имени и адреса. Значения могут быть взяты из свойства text текстового поля. Затем мы присваиваем значения двум переменным: name и address соответственно.
  3. Наконец, мы используем метод MessageBox для отображения значения имени и адреса для пользователя.

Как только вы внесете вышеуказанные изменения и запустите программу в Visual Studio, вы увидите следующий вывод

Вывод:-

Управление Tree и PictureBox

Управление Деревом

Давайте посмотрим, как мы можем реализовать это на примере, показанном ниже.

  1. Перейдите к панели инструментов свойств для древовидного элемента управления. Нажмите на свойство узла. Это вызовет редактор TreeNode
  2. В редакторе TreeNode нажмите кнопку Add Root, чтобы добавить корневой узел в коллекцию дерева.
  3. Затем измените текст корневого узла, укажите текст в качестве корневого и нажмите кнопку «ОК». Это добавит корневой узел.
  1. Сначала нажмите кнопку «Добавить дочерний элемент». Это позволит вам добавить дочерние узлы в коллекцию Tree.
  2. Для каждого дочернего узла измените свойство text. Продолжайте повторять предыдущий шаг и этот шаг и добавьте 2 дополнительных узла. В итоге у вас будет 3 узла, как показано выше, с текстом соответственно Label, Button и Checkbox.
  3. Нажмите на кнопку ОК

После внесения вышеуказанных изменений вы увидите следующий вывод.

Вывод:-

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

PictureBox Control

Этот элемент управления используется для добавления изображений в Windows Forms. Давайте посмотрим, как мы можем реализовать это на примере, показанном ниже.

  1. Сначала нажмите на свойство Image для элемента управления PictureBox. Появится новое окно.
  2. В этом окне нажмите на кнопку «Импорт». Это будет использоваться для прикрепления изображения к элементу управления Picturebox.
  3. Появится диалоговое окно, в котором вы сможете выбрать изображение для прикрепления картинки
  4. Нажмите на кнопку ОК

Как только вы сделаете вышеуказанные изменения, вы увидите следующий вывод

кально идентифицирующий окно. Элемент управления может рассматриваться как окно, поэтому у него есть соответствующий HWND . Свойство Handle можно использовать для обращения к любым вызовам Win32 API.

Некоторые вещи, которые несколько сложнее классифицировать — это возможности привязки данных. Свойство BindingContext возвращает объект

Коллекция DataBindings поддерживает ControlBindingsCollection , которая представляет коллекцию привязанных объектов элемента управления. Привязка данных обсуждается в главе 32.

CompanyName , ProductName и ProductVersions представляют данные о происхождении элемента управления и его текущей версии.

Класс Control состоит из десятков других свойств, методов и событий. Приведенный список представляет лишь некоторые из наиболее часто используемых, и предназначен для того, чтобы дать вам представление о доступной функциональности.

Стандартные элементы управления и компоненты

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

MessageBox.Show("Выполнен щелчок на " + ((Button)sender).Name + ".");

Рис. 31.2. Кнопка с меткой Default является кнопкой по умолчанию

Глава 31. Windows Forms 1065

Рис. 31.1. Внешний вид формы frmControls приложения FormsSample

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

Чтобы идентифицировать кнопку как кнопку по умолчанию, потребуется установить свойство AcceptButton формы равным ссылке на эту кнопку. После этого, если пользователь нажмет клавишу <Enter> , сгенерируется событие Click этой кнопки по умолчанию. На рис. 31.2 кнопка с меткой Default (По умолчанию) является кнопкой по умолчанию (обратите внимание на темную рамку).

Кнопки могут содержать на своей поверхности как текст, так и графическое изображение. Изображения доступны для кнопок через объект ImageList или свойство Image . Объект ImageList представляет собой именно то, что можно предположить по его названию: список изображений, который управляется компонентом, помещенным на форму. Позднее в этой главе мы рассмотрим его более детально.

Как Text , так и Image имеют свойство Align , предназначенное для выравнивания текста или изображения на поверхности кнопки. Свойство Align принимает значения типа перечисления ContentAlignment . Текст или изображение могут быть выровнены в комбинации по левой или правой границе кнопки либо по верхней или нижней границе.

1066 Часть V. Презентации

Элемент управления CheckBox (флажок) также унаследован от ButtonBase и применяется для принятия команды пользователя с двумя или тремя состояниями. Если свойство ThreeState установлено в true , то свойство CheckState элемента CheckBox может принимать одно из следующих трех перечислимых значений:

Элемент CheckBox отмечен.

Элемент CheckBox не отмечен.

В этом состоянии элемент CheckBox не доступен.

Состояние Indeterminate может быть установлено только программно, а не пользователем. Это удобно, если вы хотите сообщить пользователю, что опция не была установлена. Для получения текущего состояния в виде булевского значения можно обратиться к свойству Checked .

События CheckedChanged и CheckStateChanged возникают, когда изменяется свойство CheckState или Checked . Перехват этих событий может пригодиться для установки других значений на основе нового состояния CheckBox . В классе формы frmControls событие CheckedChanged для нескольких элементов CheckBox обрабатывается следующим методом:

private void checkBoxChanged(object sender, EventArgs e)

CheckBox checkBox = (CheckBox)sender;

Последний элемент управления, унаследованный от ButtonBase — это RadioButton (переключатель). Переключатели обычно используются в составе групп. Иногда называемые кнопками выбора (option buttons), переключатели дают возможность пользователю выбирать одну из нескольких опций. Когда вы используете множество элементов управления RadioButton в одном контейнере, выбранным может быть только один из них. Поэтому если у вас есть три опции, например, Red , Green и Blue , и если выбрана опция Red , а пользователь щелкает на Blue , то Red автоматически отключается.

Свойство Appearance принимает значение из перечисления Appearance . Оно может быть либо Button , либо Normal . Когда выбирается Normal , то переключатель выглядит как маленький кружок с меткой рядом с ним. Выбор его заполняет кружок, выбор другого переключателя из той же группы отменяет выбор текущего выбранного переключателя и делает его кружок пустым. При установке значения Appearance равным Button переключатель выглядит подобно стандартной кнопке, но работает подобно переключателю — выбранная кнопка нажата, не выбранная — отпущена.

Свойство CheckedAlign определяет, где находится кружок по отношению к тексту метки. Он может быть над текстом, под ним, справа или слева.

Событие CheckedChanged возникает всякий раз, когда значение свойства Checked изменяется. Подобным образом можно выполнить другие действия на основе нового значения элемента управления.

Глава 31. Windows Forms 1067

ComboBox , ListBox и CheckedListBox

ComboBox , ListBox и CheckedListBox — все унаследованы от класса ListControl . Этот класс определяет некоторую базовую функциональность управления списками. Самое главное в использовании списочных элементов управления — это добавление и выбор элементов списка. То, какой список нужно применять, в основном определяется тем, как его предполагается использовать, и типом данных, которые в нем должны содержаться. Если необходимо иметь возможность множественного выбора, или пользователю нужно видеть в любой момент несколько позиций списка, то лучше всего подойдут ListBox или CheckListBox . Если же в списке может быть выбран только один элемент за раз, то больше подойдет ComboBox .

Существуют два способа доступа к данным в списочном элементе управления, как показано в следующем примере кода. Список загружается объектами Vendor . Устанавливаются свойства DisplayMember и ValueMember . Этот код можно найти в классе формы frmList приложения-примера.

В начале идет метод LoadList . Этот метод загружает список объектами Vendor или простыми строками, содержащими имя поставщика. Кнопка-переключатель используется для выбора того, что именно должно загружаться в список.

private void LoadList(Control ctrlToLoad)

ListBox tmpCtrl = null; if (ctrlToLoad is ListBox)

tmpCtrl = (ListBox)ctrlToLoad; tmpCtrl.Items.Clear(); tmpCtrl.DataSource = null;

tmpCtrl.Items.Add(new Vendor("XYZ Company", "555-555-1234")); tmpCtrl.Items.Add(new Vendor("ABC Company", "555-555-2345")); tmpCtrl.Items.Add(new Vendor("Other Company", "555-555-3456")); tmpCtrl.Items.Add(new Vendor("Another Company", "555-555-4567")); tmpCtrl.Items.Add(new Vendor("More Company", "555-555-6789")); tmpCtrl.Items.Add(new Vendor("Last Company", "555-555-7890")); tmpCtrl.DisplayMember = "Name";

1068 Часть V. Презентации

tmpCtrl.Items.Add("XYZ Company"); tmpCtrl.Items.Add("ABC Company"); tmpCtrl.Items.Add("Other Company"); tmpCtrl.Items.Add("Another Company"); tmpCtrl.Items.Add("More Company"); tmpCtrl.Items.Add("Last Company");

После того, как данные загружены в список, для их получения можно использовать свойства SelectedItem и SelectedIndex . Свойство SelectedItem возвращает текущий выбранный объект. Если список разрешает множественный выбор, нет гарантии того, какой именно элемент будет возвращен. В этом случае должна использоваться коллекция SelectObject . Она содержит список всех текущих выбранных элементов списка.

Если для наполнения списка используется DataBinding (привязка данных), то свойство SelectedValue вернет то свойство выбранного объекта, которое было указано через свойство ValueMember . Если ValueMember установлено в Phone , то SelectedValue вернет значение Phone выбранного в данный момент элемента списка. Для того чтобы можно было использовать ValueMember и SelectedValue , список должен быть загружен способом DataSource . ArrayList или любая другая основанная на IList коллекция должна быть сначала заполнена объектами, потом готовый список может быть присвоен свойству DataSource . Следующий короткий пример демонстрирует сказанное.

System.Collections.ArrayList lst = new System.Collections.ArrayList(); lst.Add(new Vendor("XYZ Company", "555-555-1234"));

lst.Add(new Vendor("ABC Company", "555-555-2345")); lst.Add(new Vendor("Other Company", "555-555-3456")); lst.Add(new Vendor("Another Company", "555-555-4567")); lst.Add(new Vendor("More Company", "555-555-6789")); lst.Add(new Vendor("Last Company", "555-555-7890")); listBox1.Items.Clear();

listBox1.DataSource = lst; listBox1.DisplayMember = "Name"; listBox1.ValueMember = "Phone";

Использование SelectedValue без DataBinding приведет к исключению

В следующем фрагменте кода показан синтаксис доступа к данным списка.

// obj установлен в ссылку на выбранный объект Vendor

// obj установлен в ссылку на объект Vendor по индексу 3 (4-й по счету объект) obj = listBox.Items[3];

// obj установлен в значение свойства Phone выбранного объекта поставщика

// в этом примере предполагается, что для наполнения списка

// использовалась привязка данных

listBox1.ValuesMember = "Phone"; obj = listBox1.SelectValue;

Глава 31. Windows Forms 1069

Что необходимо помнить — все эти методы возвращают тип object . Чтобы использовать реальное значение возвращенного объекта, нужно выполнить приведение к соответствующему типу.

Свойство Items класса ComboBox возвращает ComboBox.ObjectCollection .

ComboBox представляет собой комбинацию редактируемого текстового поля и окна списка. Стиль ComboBox устанавливается передачей значения типа перечисления

DropDownStyle свойству DropDownStyle . Возможные значения DropDownStyle перечислены в табл. 31.2.

Таблица 31.2. Возможные значения DropDownStyle

Текстовую часть можно редактировать — пользователь может вводить

значение. Он также может щелкнуть на кнопке со стрелкой, чтобы раз-

Текстовая часть не редактируема. Пользователь должен делать выбор

, но окно списка видно постоянно.

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

Свойство MaxDropDownItems устанавливает количество отображаемых элементов при отображении выпадающего списка.

FindString и FindStringExact — это два полезных метода списочных элементов управления. FindString находит первую строку в списке, которая начинается с переданного в аргументе фрагмента. FindStringExact ищет первую строку, которая буквально соответствует строке, переданной в аргументе. Оба метода возвращают индекс найденного значения либо -1 , если значение не найдено. Они также могут принимать дополнительный целочисленный аргумент — стартовую позицию поиска.

DateTimePicker дает возможность пользователю выбирать значение даты или времени (либо и того, и другого) во множестве разнообразных форматов. Можно отображать значения DateTime в любом из стандартных форматов даты и времени. Свойство Format принимает значения типа перечисления DateTimePickerFormat , которые устанавливают формат в Long , Short , Time или Custom .

Если свойство Format установлено в DateTimePickerFormat.Custom , то можно установить свойство CustomFormat в строку, представляющую формат.

Предусмотрены также еще два свойства — Text и Value . Свойство Text возвращает текстовое представление значений DateTime , в то время как Value возвращает сам объект типа DateTime . Можно также установить максимальное и минимальное допустимые значения с помощью свойств MinDate и MaxDate .

Когда пользователь щелкает на стрелке, направленной вниз, отображается календарь, позволяющий выбрать нужную дату. Доступны свойства, предоставляющие возможность изменять внешний вид календаря, устанавливая заголовок и цвета текста и фона для названий месяцев.

Свойство ShowUpDown определяет, должны ли в элементе управления отображаться стрелка UpDown . Текущее высвеченное значение может изменяться щелчком на стрелке вверх или вниз.

Рис. 31.3. Пиктограмма, которая появляется в случае ввода в текстовом поле недопустимого значения

1070 Часть V. Презентации

ErrorProvider — на самом деле не элемент управления, а компонент. Когда вы перетаскиваете компонент в дизайнер форм, он отображается в лотке компонентов под дизайнером. Назначение ErrorProvider заключается в том, чтобы высвечивать пиктограмму рядом с элементом управления, когда возникает ошибочная ситуация или не проходит проверка. Предположим, что у вас есть поле TextBox , предназначенное для ввода возраста. Ваше бизнес-правило гласит, что значение возраста не должно превышать 65. Если пользователь попытается ввести большее значение, его нужно будет информировать, что введен возраст, превышающий допусти-

Вы можете создать ErrorProvider для каждого элемента управления на форме, который может быть причиной ошибки, но если у вас очень много элементов управления, это может оказаться слишком громоздко. Другой вариант — использовать один поставщик ошибок, и в событии проверки вызывать метод IconLocation с тем элементом управления, который вызвал проверку, и одним из значений перечисления ErrorIconAlignment . Это значение устанавливает выравнивание пиктограммы по элементу управления. Затем следует вызвать метод SetError . Если нет никаких ошибочных условий, можно очистить ErrorProvider , вызвав SetError с пустой строкой ошибки. В следующем примере показано, как это работает.

if(txtAge.TextLength > 0 && Convert.ToInt32(txtAge.Text) > 65)

errMain.SetIconAlignment((Control)sender, ErrorIconAlignment.MiddleRight); errMain.SetError((Control)sender, "Значение должно быть меньше 65."); e.Cancel = true;

private void txtZipCode_Validating(object sender, CancelEventArgs e)

errMain.SetIconAlignment((Control)sender, ErrorIconAlignment.MiddleRight); errMain.SetError((Control)sender, "Должно быть 5 символов.");

Глава 31. Windows Forms 1071

helpProvider1.SetHelpString(txtAge,"Введите возраст, не старше 65 лет"); helpProvider1.SetHelpString(txtZipCode, "Введите 5-значный код почтового индекса");

Компонент ImageList — это именно то, что следует из его названия — список графических изображений. Обычно этот компонент применяется для хранения коллекции изображений, используемых в качестве пиктограмм в панели инструментов или пиктограмм в элементах управления TreeView . Многие элементы управления включают в себя свойство ImageList . Свойство ImageList обычно идет в комплекте с ImageIndex . Свойству ImageList присваивается компонент ImageList , а свойству ImageIndex — индекс в ImageList , представляющий изображение, которое подлежит отображению в элементе управления. Изображения добавляются в компонент ImageList с помощью метода Add свойства ImageList.Images . Свойство Images возвращает ImageCollection .

Метки Label применяются для представления пользователю описательного текста. Текст может иметь отношение к другому элементу управления либо к текущему состоянию системы. Обычно метки помещаются рядом с текстовыми полями. Метка предлагает пользователю описание типа данных для ввода в текстовое поле. Элемент

1072 Часть V. Презентации

управления Label всегда доступен только для чтения — пользователь не может изменить значение строки в его свойстве Text . Однако вы можете изменять значение свойства Text программно. Свойство UseMnemonic позволяет включить функциональность клавиши доступа. Когда букве в свойстве Text предшествует символ амперсанда ( & ), эта буква высвечивается с подчеркиванием. Нажатие клавиши <Alt> в сочетании с клавишей этой буквы устанавливает фокус на следующий (в порядке обхода) после метки элемент управления. Если свойство Text уже содержит в тексте амперсанд, то добавление второго не вызовет подчеркивания буквы. Например, если текстом метки должно быть Nuts & Bolts , то свойство должно иметь значение Nuts && Bolts . Поскольку элемент управления Label доступен только для чтения, он не может получать фокус — вот почему фокус передается следующему доступному элементу управления. По этой причине важно помнить, что если вы используете мнемонику (т.е. клавишу быстрого доступа), нужно правильно устанавливать в форме порядок обхода с помощью клавиши табуляции.

Свойство AutoSize содержит булевское значение, указывающее на то, что Label может автоматически изменять свой размер в соответствии со значением текста метки. Это может быть удобно для многоязычных приложений, где длина свойства Text изменяется в зависимости от текущего языка.

Элемент управления ListView позволяет отображать список элементов одним из нескольких способов. Можно отобразить текст с необязательной крупной пиктограммой, текст с необязательной маленькой пиктограммой или текст и маленькую пиктограмму в вертикальном списке либо в детальном представлении — когда отображается текст элемента с некоторыми дополнительными элементами в последующих столбцах. Это должно показаться вам знакомым, потому что именно так в правой части проводника файлов отображается содержимое текущей папки. ListView содержит коллекцию элементов типа ListViewItem . Класс ListViewItem позволяет устанавливать свойство Text , используемое для отображения. Кроме того, ListViewItem содержит свойство с именем SubItems , которое включает текст, появляющийся в детальном представлении.

Следующий пример демонстрирует использование ListView . Этот пример имеет дело с коротким списком стран. Каждый объект CountryList включает свойства наименования страны, аббревиатуры и валюты. Код класса CountryItem — элемента CountryList — выглядит следующим образом:

using System; namespace FormsSample

public class CountryItem : System.Windows.Forms.ListViewItem

string _cntryName = ""; string _cntryAbbrev = "";

public CountryItem(string countryName, string countryAbbreviation, string currency)

мне нужно получить все элементы управления в форме типа x. я уверен, что видел этот код однажды в прошлом, который использовал что-то вроде этого:

Я знаю, что могу перебирать все элементы управления, получая детей с помощью рекурсивной функции, но есть ли что-то проще или проще, может быть, как следующее?

вот еще один вариант для вас. Я проверял это путем создания примера приложения, затем я поставил группа и группа внутри первичной группы. Внутри вложенного GroupBox я поставил 3 элемента управления TextBox и кнопку. Это код, который я использовал (даже включает рекурсию, которую вы искали)

чтобы проверить его в событии загрузки формы, я хотел подсчитать все элементы управления внутри начального GroupBox

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

Это улучшенная версия рекурсивного GetAllControls (), которая фактически работает на частных vars:

Я объединил кучу предыдущих идей в метод расширения. Преимущества здесь в том, что вы получаете правильно набранный перечислимый назад, плюс наследование обрабатывается правильно OfType() .

для этого можно использовать запрос LINQ. Это будет запрашивать все в форме, которая является типом TextBox

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

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

таким образом, мы можем вызвать функцию следующим образом:

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

Так что вам также нужно проверить, если

в любой рекурсивной функции.

Это результат, который я получил от макета для тестирования этого кода:

попробовать одна кнопка и один RichTextBox на a форма.

Читайте также: