Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад] [Содержание] [Дальше]

Визуальное проектирование приложений C#


А.В. Фролов, Г.В. Фролов

Глава 5. Диалоговые окна.. 2

Окно сообщений MessageBox.. 2

Перегруженные методы MessageBox.Show.. 2

Параметры метода MessageBox.Show.. 3

Возвращаемое значение. 4

Доработка меню File приложения SimpleNotepad. 4

Создание модальных окон.. 7

Замена окну MassageBox. 7

Создание новой формы.. 7

Создание обработчиков событий. 8

Отображение формы.. 8

Альтернативный способ передачи информации из формы.. 9

Диалоговое окно регистрации программы.. 10

Создание формы регистрации. 10

Поля ввода текстовой информации. 10

Флажки с зависимой фиксацией. 11

Флажки с независимой фиксацией. 11

Список ComboBox. 11

Добавление календаря. 12

Кнопки для закрытия формы.. 12

Настройка свойств формы.. 12

Программирование формы регистрации. 13

Обработка событий. 13

Передача регистрационной информации. 13

Добавление свойств. 13

Свойства для текстовых полей. 15

Свойства для флажков с зависимой фиксацией. 15

Свойства для флажков с независимой фиксацией. 16

Свойство для календаря. 17

Отображение формы регистрации. 17

Немодальные диалоговые окна.. 19

Приложение PropertyApp. 19

Форма главного окна приложения PropertyApp. 20

Немодальная форма настройки свойств. 21

Проверка данных формы... 22

Подключение компонента ErrorProvider. 22

Создание обработчика события Validating. 23

Настройка свойств компонента ErrorProvider. 25

 

Глава 5. Диалоговые окна

В предыдущей главе на примере приложения SimpleNotepad мы познакомились со многими аспектами визуального проектирования приложений с использованием системы разработки Microsoft Visual Studio .NET. В частности, мы создавали такие объекты, как диалоговые окна (диалоговые формы).

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

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

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

Окно сообщений MessageBox

Во 2 главе нашей книги мы рассказывали Вам о том, как создать простейшее модальное окно сообщений на базе класса MessageBox, входящего в библиотеку классов Microsoft .NET Framework. Мы использовали это окно в приложении Hello (листинг 2-1).

Для удобства мы воспроизвели внешний вид окна класса MessageBox, отображаемого приложением Hello, на рис.5-1.

Рис. 5-1. Диалоговое окно с сообщением

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

MessageBox.Show("Для Вас есть сообщение!");

Ниже мы привели прототип использованного здесь метода Show:

public static DialogResult Show(string message);

Когда пользователь щелкает кнопку OK, метод Show возвращает значение, равное DialogResult.OK.

Перегруженные методы MessageBox.Show

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

Прототип наиболее общего варианта метода MessageBox.Show, позволяющий реализовать практически все возможности диалогового окна MessageBox, приведен ниже:

public static DialogResult Show(
  string message,         // текст сообщения
  string caption,         // заголовок окна
  MessageBoxButtons btns, // кнопки, расположенные в окне
  MessageBoxIcon icon,    // значок, расположенный в окне
  MessageBoxDefaultButton defButton, // кнопка по умолчанию
  MessageBoxOptions opt   // дополнительные параметры
);

Параметры метода MessageBox.Show

Рассмотрим назначение отдельных параметров метода MessageBox.Show.

Параметр caption позволяет задать текст заголовка диалогового окна MessageBox.

С помощью параметра btns Вы можете указать, какие кнопки необходимо расположить в окне диалогового окна. Этот параметр задается константами из перечисления MessageBoxButtons (табл. 5-1).

Таблица 5-1. Перечисление MessageBoxButtons

Константа

Кнопки, отображаемые в окне MessageBox

OK

OK

OKCancel

OK, Cancel

YesNo

Yes, No

YesNoCancel

Yes, No, Cancel

RetryCancel

Retry, Cancel

AbortRetryIgnore

Abort, Retry, Ignore

 

Параметр icon метода MessageBox.Show позволяет выбрать один из нескольких значков для расположения в левой части диалогового окна. Он задается в виде константы перечисления MessageBoxIcon (табл. 5-2).

Таблица 5-2. Перечисление MessageBoxIcon

Константа

Значок

Asterisk

Error

Exclamation

Hand

Information

None

Значок не отображается

Question

Stop

Warning

 

Как видите, для диалогового окна MessageBox можно выбирать один из четырех значков. Если же эти значки Вам не подходят, придется отказаться от использования диалогового окна MessageBox и создавать свое собственное модальное диалоговое окно.

Параметр defButton метода MessageBox.Show предназначен для выбора кнопки, которая получит фокус сразу после отображения диалогового окна. Этот параметр должен иметь одно из значений перечисления MessageBoxDefaultButton (табл. 5-3).

Таблица 5-3. Перечисление MessageBoxDefaultButton

Константа

Номер кнопки, получающей фокус ввода по умолчанию

Button1

1

Button2

2

Button3

3

 

Если в диалоговом окне отображаются кнопки Yes, No и Cancel, то они будут пронумерованы последовательно: кнопка Yes получит номер 1 (константа Button1), кнопка No — номер 2 (константа Button2), а кнопка Cancel — номер 3 (константа Button3).

И, наконец, последний параметр opt метода MessageBox.Show позволяет задать дополнительные параметры. Эти параметры должны иметь значения из перечисления MessageBoxOptions (табл. 5-4).

Таблица 5-4. Перечисление MessageBoxOptions

Константа

Описание

DefaultDesktopOnly

Окно с сообщением отображается только на рабочем столе, выбранном по умолчанию (в системах с несколькими рабочими столами)

RightAlign

Текст сообщения выравнивается по правому краю диалогового окна

RtlReading

Текст отображается справа налево

ServiceNotification

Окно отображается на активном рабочем столе, даже если к системе не подключился ни один пользователь. Данный параметр предназначен для приложений, работающих как сервисы ОС Microsoft Windows

Возвращаемое значение

Если в окне диалогового окна MessageBox имеется несколько кнопок, то для того чтобы определить, какую кнопку щелкнул пользователь, программа должна проанализировать значение, возвращенное методом MessageBox.Show.

Метод MessageBox.Show может вернуть одно из нескольких значений перечисления DialogResult (табл. 5-5).

Таблица 5-5. Перечисление DialogResult

Константа

Кнопка, при щелчке которой возвращается эта константа

Abort

Abort

Cancel

Cancel

Ignore

Ignore

No

No

None

Модальное диалоговое окно продолжает работать

OK

OK

Retry

Retry

Yes

Yes

Доработка меню File приложения SimpleNotepad

Вооружившись новыми знаниями относительно перегруженных методов MessageBox.Show, доработаем наше приложение SimpleNotepad (на протяжении этой главы мы будем дорабатывать это приложение, полные исходные тексты после всех доработок Вы найдете в приложении 1 к нашей книге).

Сделаем так, чтобы при попытке создать или загрузить новый документ, когда старый документ не был сохранен, программа запрашивала пользователя о необходимости сохранения старого документа (рис. 5-2).

Рис. 5-2. Запрос на сохранение документа

Если пользователю нужно сохранить старый документ, он должен щелкнуть в диалоговом окне Сохранение документа кнопку Yes. При этом на экране появится диалоговое окно сохранения документа.

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

И, наконец, кнопка Cancel позволит отказаться от создания или загрузки нового документа и вернуться к редактированию старого документа.

Для реализации этих усовершенствований необходимо внести изменения в методы MenuFileNew, MenuFileOpen и menuFileExit_Click.

Вот новый исходный текст метода MenuFileNew:

/// <summary>
/// Создание нового файла
/// </summary>
private void MenuFileNew()
{
  if(m_DocumentChanged)
  {
     DialogResult result = MessageBox.Show(
       "Документ изменен. \nСохранить изменения?",
       "Сохранение документа", MessageBoxButtons.YesNoCancel,
       MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);

     switch(result)
     {
       case DialogResult.Yes:
       {
          MenuFileSaveAs();
          break;
       }
       case DialogResult.Cancel:
       {
          return;
       }
     }
  }

  richTextBox1.Clear();
  statusBarPanel2.Text = "";
  m_DocumentChanged = false;
}

Напомним, что при изменении содержимого окна редактирования в переменную m_DocumentChanged записывается значение true. В этом случае метод MenuFileNew вызовет метод MessageBox.Show для отображения на экране окна Сохранение документа, показанного на рис. 5-2.

Далее метод MenuFileNew проанализирует значение, возвращенное методом MessageBox.Show. Это значение зависит от того, какую кнопку щелкнул пользователь.  Соответственно, метод MenuFileNew предпримет различные действия.

Если пользователь щелкнул кнопку Yes, метод MessageBox.Show возвращает значение DialogResult.Yes. В этом случае метод MenuFileNew приглашает пользователя сохранить старый документ, вызывая для этого метод MenuFileSaveAs.

В том случае, когда пользователь отказался от сохранения старого документа, метод MenuFileNew очищает окно редактора richTextBox1 и убирает строку сообщения об изменении документа из правой панели строки состояния нашего приложения.

И, наконец, если пользователь щелкнул кнопку Cancel, метод MenuFileNew возвращает управление, не предпринимая никаких действий.

Аналогичным образом доработаны методы MenuFileOpen и menuFileExit_Click:

/// <summary>
/// Открытие существующего файла
/// </summary>
private void MenuFileOpen()
{
  if(m_DocumentChanged)
  {
     DialogResult result = MessageBox.Show(
       "Документ изменен. \nСохранить изменения?",
       "Сохранение документа", MessageBoxButtons.YesNoCancel,
       MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);

     switch(result)
     {
       case DialogResult.Yes:
       {
          MenuFileSaveAs();
          break;
       }
       case DialogResult.Cancel:
       {
          return;
       }
     }
  }

  if(openFileDialog1.ShowDialog() ==
     System.Windows.Forms.DialogResult.OK &&
     openFileDialog1.FileName.Length > 0)
  {
     try
     {
       richTextBox1.LoadFile(openFileDialog1.FileName,
          RichTextBoxStreamType.RichText);
     }
     catch (System.ArgumentException ex)
     {
       richTextBox1.LoadFile(openFileDialog1.FileName,
          RichTextBoxStreamType.PlainText);
     }
     this.Text = "Файл [" + openFileDialog1.FileName + "]";
     statusBarPanel2.Text = "";
     m_DocumentChanged = false;
  }
}



private void menuFileExit_Click(object sender, System.EventArgs e)
{
  if(m_DocumentChanged)
  {
     DialogResult result = MessageBox.Show(
       "
Документ изменен. \nСохранить изменения?",
       "
Сохранение документа", MessageBoxButtons.YesNoCancel,
       MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);

     switch(result)
     {
       case DialogResult.Yes:
       {
          MenuFileSaveAs();
          break;
       }
       case DialogResult.Cancel:
       {
          return;
       }
     }
  }
  this.Close();
}

Мы оставляем Вам эти методы для самостоятельного изучения.

Создание модальных окон

Как мы уже говорили, помимо только что рассмотренного модального диалогового окна класса MessageBox программисту доступны стандартные модальные диалоговые окна, предназначенные для выполнения основных операций. Такие окна мы использовали в предыдущей главе для приложения SimpleNotepad.

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

Замена окну MassageBox

Хотя в приложении SimpleNotepad мы уже создавали собственное модальное окно About SimpleNotepad для отображения информации о программе (рис. 4-33), это окно не возвращало никаких значений. Теперь мы создадим диалоговое окно, заменяющее окно MessageBox и предназначенное для выдачи запроса пользователю о необходимости сохранения документа в приложении SimpleNotepad. Т.е. мы заменим стандартное окно Сохранение документа, показанное на рис. 5-2, своим собственным модальным диалоговым окном.

Создание новой формы

Прежде всего, добавьте в проект новую форму. Для этого щелкните правой клавишей мыши строку названия проекта SimpleNotepad в окне Solution Explorer. Затем выберите из меню Add  строку Add Windows Form (рис. 4-30). На экране появится окно Add New Item, показанное на рис. 4-31. В правой части этого окна, содержащей значки шаблонов, будет выделен шаблон Windows Form.

Введите в поле Name строку SaveDocumentNeededForm.cs, а затем щелкните кнопку Open. В результате к проекту будет добавлена новая форма, а также новый класс SaveDocumentNeededForm.

Отредактируйте эту форму, добавив в нее графическое изображение, текст с предупреждением о необходимости сохранения документа, а также кнопки Да, Нет и Отменить (рис. 5-3).

Рис. 5-3. Форма Сохранение документа

Чтобы форма вела себя как стандартное модальное диалоговое окно ОС Microsoft Windows, необходимо настроить некоторые ее свойства. Проведите настройку в соответствии с табл. 5-6.

Таблица 5-6. Настройка свойств формы SaveDocumentNeededForm

Свойство

Значение

FormBorderStyle

FixedDialog

StartPosition

CenterParent

ControlBox

false

MinimizeBox

false

MaximizeBox

false

ShowInTaskbar

false

Text

About SimpleNotepad

CancelButton

buttonCancel

AcceptButton

buttonYes

 

Почти все эти настройки мы уже использовали для диалогового окна About SimpleNotepad (рис. 4-32). Это окно мы создавали в предыдущей главе для отображения информации о приложении SimpleNotepad.

Здесь добавилась только две настройки — мы присвоили свойству CancelButton идентификатор кнопки Отменить, а свойтсву AcceptButton — идентификатор кнопки Да.

В результате наше диалоговое окно можно будет закрыть при помощи клавиши Esc. Кроме того, нажатие клавиши Enter на клавиатуре будет эквивалентно щелчку мышью кнопки Да. Настройте эти свойства подобным образом и для упомянутого выше диалогового окна About SimpleNotepad.

Заметим, что свойству CancelButton можно присвоить не только идентификатор кнопки, но и также идентификатор любого объекта, реализующего интерфейс IButtonControl, в частности, элемент управления LinkLabel.

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

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

Для этого отредактируйте свойство кнопок Name. Установите значение этого свойства для кнопки Да, равным buttonYes, а для кнопок Нет и Отменить — равным buttonNo и buttonCancel, соответственно.

Создание обработчиков событий

Далее создайте для всех кнопок обработчики событий, а затем измените их следующим образом:

private void buttonYes_Click(object sender, System.EventArgs e)
{
  DialogResult = DialogResult.Yes;
}

private void buttonNo_Click(object sender, System.EventArgs e)
{
  DialogResult = DialogResult.No;
}

private void buttonCancel_Click(object sender, System.EventArgs e)
{
  DialogResult = DialogResult.Cancel;
}

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

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

Отображение формы

Итак, мы добавили к проекту приложения SimpleNotepad новую форму и настроили ее должным образом. Теперь измените исходный текст методов MenuFileNew, MenuFileOpen и menuFileExit_Click.

Ниже мы привели новый исходный текст метода MenuFileNew:

private void MenuFileNew()
{
  if(m_DocumentChanged)
  {
     SaveDocumentNeededForm dialog = new SaveDocumentNeededForm();
     DialogResult result = dialog.ShowDialog();

     switch(result)
     {
       case DialogResult.Yes:
       {
          MenuFileSaveAs();
          break;
       }
       case DialogResult.Cancel:
       {
          return;
       }
     }
  }

  richTextBox1.Clear();
  statusBarPanel2.Text = "";
  m_DocumentChanged = false;
}

По сравнению с предыдущим вариантом этого метода мы заменили вызов метода MessageBox.Show следующими строками, отображающими на экране диалоговое окно Сохранение документа, показанное на рис. 5-3:

SaveDocumentNeededForm dialog = new SaveDocumentNeededForm();
DialogResult result = dialog.ShowDialog();

Обратите внимание, что значение, возвращенное методом dialog.ShowDialog, сохраняется в переменной result и используется в дальнейшем для определения кнопки, которую щелкнул пользователь в окне Сохранение документа.

Метод dialog.ShowDialog вернет то самое значение, которое обработчик событий нажатой кнопки записал в свойство DialogResult формы SaveDocumentNeededForm.

Аналогичные изменения Вам нужно внести в исходный текст методов MenuFileOpen и menuFileExit_Click.

Альтернативный способ передачи информации из формы

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

Удалите из исходного текста формы SaveDocumentNeededForm обработчики событий от кнопок, добавленные на предыдущем этапе. О том, как это правильно делать, мы рассказали в разделе «Удаление обработчика событий» 3 главы.

Далее отредактируйте свойство DialogResult кнопок Да, Нет и Отменить (рис. 5-4).

Рис. 5-4. Настройка свойства DialogResult для кнопки Да

Присвойте свойству DialogResult кнопке Да значение Yes, выбрав это значение из списка, показанного на рис. 5-4. Этому же самому свойству кнопок Нет и Отменить присвойте, соответственно, значения No и Cancel.

Когда пользователь щелкает одну из наших кнопок, значение свойства DialogResult щелкнутой кнопки будет присвоено свойству DialogResult диалогового окна, в котором эта кнопка расположена. В нашем случае это окно SaveDocumentNeededForm.

Заметим, что большинство кнопок, располагаемых в модальных диалоговых окнах, создается для того, чтобы закрыть это окно. В зависимости от того, какая кнопка была для этого использована, вызывающая программа предпринимает те или иные действия. Благодаря тому, что в классе Button, на базе которого создаются кнопки, предусмотрено свойство DialogResult, обработка событий от этих кнопок сильно упрощается. Фактически для этого Вам не нужно писать вручную ни одной строчки кода.

Диалоговое окно регистрации программы

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

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

Создание формы регистрации

Добавьте в проект форму Регистрация программы, создав для нее файл RegisterForm.cs. Процедура добавления в проект новых форм уже была описана ранее (например, в разделе «Замена окну MassageBox» этой главы), поэтому мы не будем о ней подробно рассказывать.

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

Рис. 5-5. Диалоговое окно регистрации программы

Вам нужно будет добавить ряд элементов управления из инструментальной панели Toolbox системы разработки приложений Microsoft Visual Studio .NET. Ниже мы расскажем о том, какие элементы управления требуется добавить, и как настроить их свойства. Затем мы займемся подготовкой обработчиков сообщений.

Поля ввода текстовой информации

Всего в форме Регистрация программы мы предусмотрели четыре поля ввода текстовой информации. Это поля Ф.И.О., Адрес E-Mail, Оставьте Ваш комментарий, а также поле ввода названия любимой ОС.

Добавив в форму указанные поля, измените их идентификаторы, хранящиеся в свойстве Name, в соответствии с табл. 5-7.

Таблица 5-7. Идентификаторы полей ввода текстовой информации

Поле

Идентификатор

Ф.И.О.

textBoxName

Адрес E-Mail

textBoxEmail

Оставьте Ваш комментарий

textBoxComment

Поле ввода названия любимой ОС

textBoxFavoriteOS

 

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

Так как поле Оставьте Ваш комментарий предназначено для ввода многострочного комментария, установите значение свойства Multiline равным true. После этого Вы сможете отрегулировать не только ширину, но и высоту этого поля.

Далее, установите значение свойства Enabled поля ввода названия любимой ОС textBoxFavoriteOS, равным false. В этом случае сразу после отображения формы данное поле будет заблокировано. Разблокировка поля будет осуществляться обработчиком событий от флажка Другая (укажите, какая), т.к. это поле нужно только в том случае, если пользователь отметил этот флажок.

Флажки с зависимой фиксацией

Форма регистрации содержит две группы флажков с независимой фиксацией. Группа флажков Пол позволяет указать пол владельца копии программы, а группа флажков Любимая ОС — название любимой операционной системы владельца.

Заметим, что вторая группа флажков снабжена дополнительным полем ввода текстовой информации. Если пользователю не нравится ни Microsoft Windows, ни Linux, он может отметить флажок Другая (укажите, какая), а затем ввести название своей любимой ОС в этом дополнительном текстовом поле.

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

Для объединения флажков Муж. и Жен. в группу Пол перетащите из инструментальной панели Toolbox элемент управления GroupBox. Запишите строку «Пол» в свойство Text этого элемента управления.

Затем перетащите внутрь окна элемента управления GroupBox два флажка типа RadioButton. Это и есть флажки с зависимой фиксацией. Свое название они получили по аналогии с кнопками радиоприемника, которые можно нажимать только по одной.

Измените надпись около флажков в соответствии с рис. 5-5, отредактировав свойства флажков Text.

Аналогичным образом создайте группу флажков Любимая ОС, добавив в нее три флажка MS Windows, Linux и Другая (укажите, какая).

Добавив все флажки и расположив их внутри соответствующих окон GroupBox, проверьте их идентификаторы, хранящиеся в свойстве Name, на соответствие табл. 5-8.

Таблица 5-8. Идентификаторы флажков с зависимой фиксацией

Флажок

Идентификатор

Муж.

radioButton1

Жен.

radioButton2

MS Windows

radioButton3

Linux

radioButton4

Другая (укажите, какая)

radioButton5

Флажки с независимой фиксацией

Флажки с независимой фиксацией не нужно объединять в группы, т.к. они работают независимо друг от друга. Вам нужно добавить в форму регистрации два таких флажка класса CheckBox, перетащив их мышью из инструментальной панели Toolbox.

Флажок Подписка на новости должен иметь идентификатор checkBoxSendNews, а флажок Подписка на электронную газету — идентификатор checkBoxSendLetter. Таким образом, для этих флажков нужно настроить только свойства Name (идентификатор) и Text (текст, расположенный около флажка).

Список ComboBox

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

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

Далее необходимо заполнить список текстовыми строками, отредактировав свойство Items. Для этого будет запущен редактор набора строк String Collection Editor (рис. 5-6).

Рис. 5-6. Редактор набора строк

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

Чтобы по умолчанию в списке Квалификация была выбрана строка Начальная, запишите эту строку в свойство Text элемента управления ComboBox.

Добавление календаря

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

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

Кнопки для закрытия формы

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

Кнопка Зарегистрировать должна иметь идентификатор button1, а кнопка Отменить — идентификатор button2.

Запишите в свойство DialogResult кнопки Регистрация программы значение Yes, а в свойство DialogResult кнопки Отменить — значение Cancel.

В результате при закрытии формы кнопкой Регистрация программы вызывающий метод получит от метода ShowDialog значение DialogResult.Yes, а при закрытии формы кнопкой Отменить — значение DialogResult.Cancel.

Настройка свойств формы

При редактировании свойств формы Вам нужно изменить ее название, хранящееся в свойстве Text, а также назначить кнопки клавишам Esc и Enter.

Когда пользователь нажимает на клавиатуре клавишу Esc, процедура регистрации должна быть отменена, как при щелчке кнопки Отменить. Поэтому свойству формы CancelButton необходимо присвоить идентификатор кнопки Отменить (button2).

Что же касается клавиши Enter, то ее нужно связать с клавишей Зарегистрировать. Это позволит завершить вод данных регистрации естественным образом — нажатием клавиши Enter. Чтобы обеспечить такую функциональность, присвойте свойству AcceptButton нашей формы значение идентификатора кнопки Зарегистрировать (button1).

Программирование формы регистрации

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

Обработка событий

Благодаря тому, что мы настроили свойство DialogResult кнопок Зарегистрировать и Отменить, присвоив им значения DialogResult.Yes и DialogResult.Cancel соответственно, нам не нужно обрабатывать события, создаваемые этими кнопками.

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

Тем не менее, один обработчик событий нам все же придется создать. Речь идет об обработчике событий для флажка Другая (укажите, какая), входящего в группу флажков Любимая ОС.

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

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

private void radioButton5_CheckedChanged(object sender,
  System.EventArgs e)
{
  RadioButton rb = (RadioButton)sender;

  if(rb.Checked)
     textBoxFavoriteOS.Enabled = true;
  else
     textBoxFavoriteOS.Enabled = false;
}

Получив управление, этот обработчик событий сохраняет ссылку на флажок, создавший событие, в переменной rb. Далее программа проверяет значение, хранящееся в свойстве rb.Checked.

Если это значение равно true, флажок отмечен. В этом случае обработчик событий снимает блокировку с поля textBoxFavoriteOS, записывая в свойство textBoxFavoriteOS.Enabled значение true.

В том случае, когда значение свойства rb.Checked равно false, событие было вызвано тем, что пользователь снял отметку с нашего флажка. В этом случае программа вновь блокирует поле textBoxFavoriteOS, записывая в свойство textBoxFavoriteOS.Enabled значение false.

Передача регистрационной информации

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

Добавление свойств

Вы можете добавить свойства вручную, отредактировав исходный текст файла RegisterForm.cs, однако Microsoft Visual Studio .NET может оказать Вам в этом некоторую помощь.

Откройте вкладку Class View, расположенную в правом верхнем углу этой системы разработки приложений (рис. 5-7). 

Рис. 5-7. Добавление нового свойства

На этой вкладке раскройте папку проекта SimpleNotepad. В ней Вы увидите папки классов — HelpAboutForm, RegisterForm, SaveDocumentNeededForm и SimpleNotepadForm. Каждая такая папка создается для класса, реализующего ту или иную форму нашего приложения.

Раскройте папку RegisterForm. В ней находятся методы, свойства, поля, интерфейсы и другие объекты класса. Чтобы создать новый метод, щелкните правой клавишей мыши строку названия класса RegisterForm, а затем выберите из контекстного меню Add строку Add Property, как это показано на рис. 5-7.

В результате на экране появится окно мастера свойств (рис. 5-8).

Рис. 5-8. Указание параметров свойства

Выберите в поле Property access тип доступа public, тип свойства Property type string, а имя свойства Property name укажите как UserName. Это свойство будет использовано нами для получения имени пользователя, введенного в форме регистрации.

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

Свойства для текстовых полей

В результате выполнения описанных выше действий мастер свойств создаст в файле RegisterForm.cs пустое тело свойства UserName. Отредактируйте его следующим образом:

public string UserName
{
  get
  {
     return textBoxName.Text;
  }
}

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

Подготовьте аналогичным образом свойства UserEmail, UserLevel и UserComment:

public string UserEmail
{
  get
  {
     return textBoxEmail.Text;
  }
}

public string UserLevel
{
  get
  {
     return comboBoxLevel.Text;
  }
}

public string UserComment
{
  get
  {
     return textBoxComment.Text;
  }
}

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

Свойства для флажков с зависимой фиксацией

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

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

public string UserGender
{
  get
  {
     for(int i=0; i < groupBoxGender.Controls.Count; i++)
     {
       RadioButton rb = (RadioButton)groupBoxGender.Controls[i];
       if(rb.Checked)
          return rb.Text;
     }
     return "";
  }
}

Здесь мы в цикле перебираем все элементы управления, расположенные внутри блока groupBoxGender. Количество таких элементов хранится в свойстве groupBoxGender.Controls.Count.

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

Далее программный код свойства UserGender проверяет состояние очередного флажка. Если флажок отмечен, то в свойстве rb.Checked хранится значение true. В этом случае функция доступа нашего свойства возвращает текст флажка, хранящийся в свойстве rb.Text. Иначе программа переходит к проверке следующего флажка.

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

Что же касается группы флажков groupBoxOS, то в ней помимо собственно флажков имеется текстовое поле textBoxFavoriteOS. Напомним, что если пользователь не любит ни Microsoft Windows, ни Linux, то он может ввести в этом поле название своей любимой ОС.

В процессе циклического перебора функция доступа обязательно столкнется с текстовым полем textBoxFavoriteOS, и не сможет привести ссылку на него к типу RadioButton. Для того чтобы исключить появление ошибки во время выполнения программы, мы проверяем тип каждого элемента управления при помощи ключевого слова is:

public string FavoriteOS
{
  get
  {
     for(int i=0; i < groupBoxOS.Controls.Count; i++)
     {
       if(groupBoxOS.Controls[i] is RadioButton)
       {
          RadioButton rb = (RadioButton)groupBoxOS.Controls[i];

          if(rb.Checked)
          {
            if(rb.Name != radioButton5.Name)
              return rb.Text;
            else
              return textBoxFavoriteOS.Text;
          }
       }
     }
     return "";
  }
}

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

В том случае, если функция доступа обнаружила отмеченный флажок, она проверяет его идентификатор. В том случае, если пользователь отметил флажок Другая (укажите, какая), функция доступа читает свойство textBoxFavoriteOS.Text, а не свойство Text отмеченной кнопки. В результате функция доступа вернет в этом случае название ОС, введенное пользователем в текстовом поле.

Заметим, что использованную здесь проверку типов следует применить и в свойстве UserGender, исходный текст которого был рассмотрен ранее. Это позволит избежать ошибок в том случае, если Вы решите добавить в группу groupBoxGender элементы, отличные от флажков RadioButton.

Свойства для флажков с независимой фиксацией

Свойства, предназначенные для передачи в вызывающую программу состояния флажков с независимой фиксацией, выглядят достаточно просто:

public string SendNews
{
  get
  {
     if(checkBoxSendNews.Checked)
       return "Yes";
     else
       return "No";
  }
}

public string SendLetter
{
  get
  {
     if(checkBoxSendLetter.Checked)
       return "Yes";
     else
       return "No";
  }
}

Соответствующие функции доступа определяют, отмечены флажки или нет, проверяя свойства checkBoxSendNews.Checked и checkBoxSendLetter.Checked . В зависимости от этого они возвращают ту или иную текстовую строку.

Свойство для календаря

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

public string UserBirthDay
{
  get
  {
     DateTime dt = monthCalendar1.SelectionStart;
     return dt.Day + "."
+ dt.Month + "." + dt.Year;
  }
}

Здесь мы вначале получаем из свойства monthCalendar1.SelectionStart дату, выделенную пользователем, и сохраняем эту дату в переменной dt типа DateTime. Далее из отдельных компонентов даты (календарного числа dt.Day, номера месяца dt.Month и года dt.Year) формируется текстовая строка. Эта строка и возвращается функцией доступа get.

Отображение формы регистрации

Для отображения формы регистрации добавьте в меню Help приложения SimpleNotepad строку Register. Затем создайте для этой строки следующий обработчик события menuHelpRegister_Click:

private void menuHelpRegister_Click(object sender,
  System.EventArgs e)
{
  RegisterForm dialog = new RegisterForm();
  if(DialogResult.Yes == dialog.ShowDialog())
  {
     string body = "Данные регистрации:";

     body += " Name:" + dialog.UserName;
     body += ", Email:" + dialog.UserEmail;
     body += ", Level:" + dialog.UserLevel;
     body += ", Gender:" + dialog.UserGender;
     body += ", FavoriteOS:" + dialog.FavoriteOS;
     body += ", SendNews:" + dialog.SendNews;
     body += ", SendLetter:" + dialog.SendLetter;
     body += ", BirthDay:" + dialog.UserBirthDay;
     body += ", Comment:" + dialog.UserComment;

     System.Diagnostics.Process.Start(
       "mailto:alexandre@frolov.pp.ru?subject=Регистрация&body=" +
       body);
  }
}

Вначале этот обработчик создает форму регистрации как объект класса RegisterForm и сохраняет ее идентификатор в переменной dialog. Далее форма отображается на экране методом dialog.ShowDialog. На рис. 5-9 эта форма показана в заполненном виде.

Рис. 5-9. Поля окна регистрации заполнены (все приведенные здесь данные вымышлены)

Если пользователь щелкнул кнопку Зарегистрировать, метод dialog.ShowDialog возвращает значение DialogResult.Yes. В этом случае обработчик события menuHelpRegister_Click формирует текстовую строку body, записывая в нее значения, извлеченные из свойств формы.

Далее обработчик события запускает почтовую программу, установленную на компьютере пользователя, вызывая для этого метод System.Diagnostics.Process.Start:

System.Diagnostics.Process.Start(
"mailto:alexandre@frolov.pp.ru?subject=
Регистрация&body=" + body);

В качестве параметра этому методу передается адрес электронной почты, а также содержимое поля subject и тело сообщения. В результате на экране появится окно редактора нового сообщения E-Mail, которое уже будет полностью подготовлено (рис. 5-10).

Рис. 5-10. Письмо с данными регистрации готово к отправке

Для отправки сообщения пользователю останется только щелкнуть кнопку Отправить, расположенную в этом окне.

Немодальные диалоговые окна

Немодальные диалоговые окна «живут» и работают одновременно с породившим их главным окном приложения. Таки окна часто используются для «плавающих» инструментальных панелей, вроде панелей известного графического редактора Adobe Photoshop. Эти окна могут применяться и для настройки различных параметров приложения, причем отсутствие модальности позволяет использовать в приложении измененные параметры, не закрывая окно настройки этих параметров.

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

Немодальные окна, как и модальные, создаются на базе классов, произведенных от класса System.Windows.Form. Однако для их отображения применяется не метод ShowDialog, а метод Show. Кроме того, свойства формы немодального диалогового окна настраиваются иначе, чем свойства формы модального окна.

Приложение PropertyApp

Для демонстрации приемов работы с немодальными окнами мы подготовили приложение PropertyApp, главное окно которого показано на рис. 5-11.

Рис. 5-11. Главное окно приложения PropertyApp

В этом окне располагаются два поля ввода текстовой информации, предназначенных для ввода адресов серверов электронной почты POP3 и SMTP (первый из них предназначен для приема сообщений электронной почты, а второй — для передачи).

Пользователь имеет возможность ввести эти адреса непосредственно в полях Адрес сервера POP3 и Адрес сервера SMTP, расположенных в главном окне приложения. Но есть и еще одна возможность — пользователь может щелкнуть кнопку Настроить, и затем ввести адреса серверов в появившемся на экране немодальном окне Настройка свойств, показанном на рис. 5-12.

Рис. 5-12. Немодальное окно для ввода адресов почтовых серверов

Наше окно Настройка свойств обладает одним интересным свойством — оно создает события и передает их в главное окно приложения. Событие создается, когда пользователь щелкает кнопку Изменить (рис. 5-12). Обработчик данного события, предусмотренный в классе главного окна приложения, переписывает информацию из полей окна Настройка свойств в соответствующие поля главного окна приложения Серверы электронной почты.

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

Форма главного окна приложения PropertyApp

Создавая форму главного окна приложения (рис. 5-11), добавьте в нее два поля ввода текста и две кнопки. Поле, обозначенное как Адрес сервера POP3, должно иметь идентификатор Name, равный textBoxPOP3, а поле Адрес сервера SMTP — идентификатор textBoxSMTP.

Для кнопки Закрыть подготовьте обработчик события button2_Click:

private void button2_Click(object sender, System.EventArgs e)
{
  this.Close();
}

Когда пользователь щелкает эту кнопку, главное окно приложения исчезает с экрана.

Вторая кнопка Настроить предназначена для отображения на экране немодального окна Настройка свойств, показанного на рис. 5-12. Вам следует создать для этой кнопки обработчик событий button1_Click в следующем виде:

private void button1_Click(object sender, System.EventArgs e)
{
  PropertyForm dialog = new PropertyForm();
  dialog.Owner = this;

  dialog.SMTP = this.textBoxSMTP.Text;
  dialog.POP3 = this.textBoxPOP3.Text;

  dialog.ApplyHandler += new EventHandler(PropertyForm_Apply);

  dialog.Show();
}

Здесь мы вначале создаем немодальное окно как объект класса PropertyForm, сохраняя ссылку на него в переменной dialog. Далее мы настраиваем свойство Owner, записывая в него ссылку на главное окно приложения:

dialog.Owner = this;

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

На следующем этапе обработчик событий button1_Click переписывает текст из полей ввода адресов почтовых серверов в свойства dialog.SMTP и dialog.POP3 немодального диалогового окна:

dialog.SMTP = this.textBoxSMTP.Text;
dialog.POP3 = this.textBoxPOP3.Text;

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

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

dialog.ApplyHandler += new EventHandler(PropertyForm_Apply);

Подключив обработчик событий, программа отображает дочернее окно на экране методом Show:

dialog.Show();

Обработчик событий PropertyForm_Apply нужно определить в классе формы главного окна следующим образом:

private void PropertyForm_Apply(object sender, System.EventArgs e)
{
  PropertyForm dialog = (PropertyForm)sender;
  this.textBoxPOP3.Text = dialog.POP3;
  this.textBoxSMTP.Text = dialog.SMTP;
}

Задача обработчика событий PropertyForm_Apply сводится к переписыванию адресов почтовых серверов из свойств dialog.POP3 и dialog.SMTP дочернего окна в поля редактирования главного окна. Т.е. этот обработчик предназначен для отображения в главном окне нашей программы информации, введенной пользователем в дочернем немодальном окне.

Немодальная форма настройки свойств

Теперь мы займемся формой для немодального окна. Создайте эту форму с именем PropertyForm, создав класс с именем PropertyForm.

Расположите в форме текстовые поля ввода адресов почтовых серверов и две кнопки, показанные на рис. 5-12. Идентификаторы текстовых полей ввода Адрес сервера POP3 и Адрес сервера SMTP должны быть, соответственно, textBoxPOP3 и textBoxSMTP.

Кнопка Отменить, предназначенная для закрытия немодального диалогового окна, должна иметь идентификатор buttonCancel, а кнопка Изменить, создающая событие, — идентификатор buttonApply.

Подготовив форму, отредактируйте исходный текст класса PropertyForm.

Прежде всего, добавьте ссылку ApplyHandler на событие, реализованное в виде делегата EventHandler:

/// <summary>
///
Обработчик события от кнопки Изменить
/// </summary>
public event EventHandler ApplyHandler;

Далее подготовьте исходный текст обработчика события buttonApply_Click, создаваемого кнопкой Изменить:

private void buttonApply_Click(object sender, System.EventArgs e)
{
  if(ApplyHandler != null)
     ApplyHandler(this, new EventArgs());
}

Анализируя содержимое поля ApplyHandler, этот метод проверяет, был ли определен соответствующий обработчик события в вызывающей программе. Если был, то метод buttonApply_Click вызывает его. В качестве первого параметра обработчику при этом передается ссылка на дочернее окно, а в качестве второго — ссылка на новый объект EventArgs, позволяющий задать параметры события.

Для кнопки Отменить подготовьте обработчик события buttonCancel_Click, закрывающий окно дочерней немодальной формы:

private void buttonCancel_Click(object sender, System.EventArgs e)
{
  this.Close();
}

Теперь Вам нужно определить два свойства с именами SMTP и POP3:

public string SMTP
{
  get
  {
     return textBoxSMTP.Text;
  }
  set
  {
     textBoxSMTP.Text = value;
  }
}

public string POP3
{
  get
  {
     return textBoxPOP3.Text;
  }
  set
  {
     textBoxPOP3.Text = value;
  }
}

Первое из них предназначено для хранения и передачи в вызывающую форму адреса почтового сервера SMTP, а второе — сервера SMTP. Так как вызывающая программа выполняет чтение и запись этих свойств, мы предусмотрели обе функции доступа get и set.

Функция доступа get просто возвращает содержимое соответствующего поля редактирования текста через свойство Text, а функция set — изменяет содержимое этого поля, устанавливая новое значение свойства Text.

Как все это работает?

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

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

Проверка данных формы

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

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

Подключение компонента ErrorProvider

Давайте модифицируем форму регистрации, рассмотренную нами ранее в разделе «Программирование формы регистрации» этой главы, добавив проверку данных, введенных в полях Ф.И.О. и Адрес E-Mail (рис. 5-9).

Прежде всего, откройте окно редактирования свойств редактора textBoxName, предназначенного для ввода имени, фамилии и отчества пользователя (рис. 5-13).

Рис. 5-13. Свойство CausesValidation

Обратите внимание, что значение свойства CausesValidation равно true. В результате, когда окно редактирования textBoxName потеряет фокус ввода (т.е. когда пользователь перейдет к заполнению другого поля формы), будет происходить проверка содержимого формы.

Далее перетащите на поверхность формы из инструментальной панели Toolbox системы Microsoft Visual Studio .NET значок программного компонента ErrorProvider. В результате станет возможной обработка ошибок, допущенных при заполнении полей этой формы.

Создание обработчика события Validating

На следующем этапе Вам нужно создать обработчик события Validating. Это событие возникнет в тот момент, когда элемент управления потеряет фокус ввода. Для того чтобы создать обработчик этого события, откройте вкладку событий в окне Properties и введите в поле Validating имя обработчика события textBoxName_Validating (рис. 5-14).

Рис. 5-14. Создание обработчика события Validating

В результате будет создано пустое тело метода textBoxName_Validating, которое нужно будет дополнить кодом, выполняющим все необходимые проверки.

Что касается проверки поля Ф.И.О., то мы должны убедиться, что оно не пустое. Для этого мы проверяем длину текстовой строки, введенной пользователем:

private void textBoxName_Validating(object sender,
  System.ComponentModel.CancelEventArgs e)
{
  if(textBoxName.Text.Length == 0)
  {
     errorProvider1.SetError(textBoxName, "Не указано имя");
  }
  else
     errorProvider1.SetError(textBoxName, "");
}

Если эта длина равна нулю, то обработчик события вызывает метод SetError. В качестве первого параметра этому методу передается ссылка на проверяемый элемент управления, а в качестве второго — текст сообщения об ошибке.

Для проверки содержимого поля Адрес E-Mail мы предусмотрели чуть более сложный обработчик:

private void textBoxEmail_Validating(object sender,
  System.ComponentModel.CancelEventArgs e)
{
  string email = textBoxEmail.Text;
      
  if(email.IndexOf('@') == -1 || email.IndexOf('.') == -1)
  {
     errorProvider1.SetError(textBoxEmail,
       "
Неправильный адрес E-Mail");
  }
  else
     errorProvider1.SetError(textBoxEmail, "");
}

Здесь мы проверяем, что введенный адрес электронной почты содержит символ @ и точку. Если этих символов нет, то адрес E-Mail введен с ошибкой.

На рис. 5-15 мы показали проверку ошибок в действии.

Рис. 5-15. Сообщение об ошибке в адресе E-Mail

Обратите внимание, что пользователь указал неправильный адрес электронной почты. При попытке перейти к полю Квалификация для продолжения работы с формой около поля Адрес E-Mail возникла красный значок с восклицательным знаком, сигнализирующий об ошибке. Если установить на этот значок курсор мыши, то на экране появится всплывающее окно с текстом сообщения об ошибке.

Настройка свойств компонента ErrorProvider

Выделив в окне дизайнера форм значок компонента ErrorProvider, можно настроить его свойства в окне Properties (рис. 5-16).

Рис. 5-16. Свойства компонента ErrorProvider

Рассмотрим самые необходимые свойства.

Отредактировав свойство Icon, Вы сможете заменить стандартный значок ошибки (красный кружок с восклицательным знаком) любым другим значком, добавленным предварительно в проект приложения.

Свойство BlinkRate определяет частоту мигания значка в миллисекундах.

Свойство BlinkStyle задает стиль значка и может иметь следующие значения:

·         BlinkIfDifferentError (используется по умолчанию);

·         AlwaysBlink;

·         NeverBlink

Если задать свойству BlinkStyle значение BlinkIfDifferentError, то значок будет мигать, если значок отображался ранее, но текст сообщения об ошибке стал другим.

Использование значения AlwaysBlink приводит к постоянному миганию значка, а значения NeverBlink — к отмене мигания.

[Назад] [Содержание] [Дальше]