- Создание модальных диалоговых окон и управление ими Create and manage modal dialog boxes
- Создание диалогового окна, производного от Диалогвиндов Create a dialog box derived from DialogWindow
- Создание и управление диалоговым окном, не производным от Диалогвиндов Create and manage a dialog box not derived from DialogWindow
- Form. Modal Свойство
- Определение
- Значение свойства
- Примеры
- Комментарии
- Диалоговые окна в Windows Forms Dialog Boxes in Windows Forms
- в этом разделе In This Section
- Связанные разделы Related Sections
- Как вызываются модальные диалоговые окна
- Модальное окно windows forms
Создание модальных диалоговых окон и управление ими Create and manage modal dialog boxes
При создании модального диалогового окна в Visual Studio необходимо убедиться, что родительское окно диалогового окна отключено во время отображения диалогового окна, а затем снова включить родительское окно после закрытия диалогового окна. When you create a modal dialog box inside Visual Studio, you must make sure that the parent window of the dialog box is disabled while the dialog box is displayed, then re-enable the parent window after the dialog box is closed. Если этого не сделать, может появиться сообщение об ошибке: Microsoft Visual Studio не может завершить работу, так как открыто модальное диалоговое окно. Закройте активное диалоговое окно и повторите попытку. If you do not do so, you may receive the error: Microsoft Visual Studio cannot shut down because a modal dialog is active. Close the active dialog and try again.
Это делается двумя способами. There are two ways of doing this. Рекомендуемый способ, если имеется диалоговое окно WPF, является производным от DialogWindow , а затем вызывается ShowModal для вывода диалогового окна. The recommended way, if you have a WPF dialog box, is to derive it from DialogWindow, and then call ShowModal to display the dialog box. В этом случае нет необходимости управлять модальным состоянием родительского окна. If you do this, you do not need to manage the modal state of the parent window.
Если диалоговое окно не является WPF или по какой-либо другой причине не удается создать класс диалогового окна из DialogWindow , необходимо получить родительский элемент диалогового окна, вызвав GetDialogOwnerHwnd метод и самостоятельно управлять модальным состоянием. для этого EnableModeless перед отображением диалогового окна вызовите его с параметром 0 (false) и снова вызовите метод с параметром 1 (true) после закрытия диалогового окна. If your dialog box is not WPF, or for some other reason you cannot derive your dialog box class from DialogWindow, then you must get the parent of the dialog box by calling GetDialogOwnerHwnd and manage the modal state yourself, by calling the EnableModeless method with a parameter of 0 (false) before displaying the dialog box and calling the method again with a parameter of 1 (true) after closing the dialog box.
Создание диалогового окна, производного от Диалогвиндов Create a dialog box derived from DialogWindow
Создайте проект VSIX с именем опендиалогтест и добавьте команду меню с именем опендиалог. Create a VSIX project named OpenDialogTest and add a menu command named OpenDialog. Дополнительные сведения о том, как это сделать, см. в разделе Создание расширения с помощью команды меню. For more information about how to do this, see Create an extension with a menu command.
Чтобы использовать DialogWindow класс, необходимо добавить ссылки на следующие сборки (на вкладке «платформа» диалогового окна » Добавление ссылки «): To use the DialogWindow class, you must add references to the following assemblies (in the Framework tab of the Add Reference dialog box):
В опендиалог. CS добавьте следующую using инструкцию: In OpenDialog.cs, add the following using statement:
Объявите класс с именем TestDialogWindow , производным от DialogWindow : Declare a class named TestDialogWindow that derives from DialogWindow:
Чтобы можно было максимально увеличить и развернуть диалоговое окно, задайте HasMaximizeButton для параметра и значение HasMinimizeButton true: To be able to minimize and maximize the dialog box, set HasMaximizeButton and HasMinimizeButton to true:
В OpenDialog.ShowMessageBox методе замените существующий код следующим: In the OpenDialog.ShowMessageBox method, replace the existing code with the following:
Выполните сборку и запуск приложения. Build and run the application. Должен отобразиться экспериментальный экземпляр Visual Studio. The experimental instance of Visual Studio should appear. В меню Сервис экспериментального экземпляра должна отобразиться команда с именем Invoke опендиалог. On the Tools menu of the experimental instance you should see a command named Invoke OpenDialog. При нажатии этой команды должно отобразиться диалоговое окно. When you click this command, you should see the dialog window. Вы сможете максимально увеличить и развернуть окно. You should be able to minimize and maximize the window.
Создание и управление диалоговым окном, не производным от Диалогвиндов Create and manage a dialog box not derived from DialogWindow
Для этой процедуры можно использовать решение опендиалогтест , созданное в предыдущей процедуре, с теми же ссылками на сборки. For this procedure, you can use the OpenDialogTest solution you created in the previous procedure, with the same assembly references.
Добавьте следующие using объявления: Add the following using declarations:
Создайте класс с именем TestDialogWindow2 , производным от Window : Create a class named TestDialogWindow2 that derives from Window:
Добавьте закрытую ссылку на IVsUIShell : Add a private reference to IVsUIShell:
Добавьте конструктор, который задает ссылку на IVsUIShell : Add a constructor that sets the reference to IVsUIShell:
В OpenDialog.ShowMessageBox методе замените существующий код следующим: In the OpenDialog.ShowMessageBox method, replace the existing code with the following:
Выполните сборку и запуск приложения. Build and run the application. В меню Сервис должна отобразиться команда с именем Invoke опендиалог. On the Tools menu you should see a command named Invoke OpenDialog. При нажатии этой команды должно отобразиться диалоговое окно. When you click this command, you should see the dialog window.
Form. Modal Свойство
Определение
Возвращает значение, указывающее, отображается ли форма как модальная. Gets a value indicating whether this form is displayed modally.
Значение свойства
Значение true , если форма отображается как модальная; в противном случае — false . true if the form is displayed modally; otherwise, false .
Примеры
В следующем примере свойство используется Modal для определения, отображается ли форма как модальная форма. The following example uses the Modal property to determine if a form is displayed as a modal form. Если это не так, FormBorderStyle TopLevel Свойства и изменяются, чтобы форма стала формой не верхнего уровня с границей окна инструментов. If it is not the FormBorderStyle and TopLevel properties are changed to make the form a non-top-level form with a tool window border.
Комментарии
При отображении формы в модальном режиме входные данные (нажатие клавиши или мыши) не могут быть выполнены, за исключением объектов в модальной форме. When a form is displayed modally, no input (keyboard or mouse click) can occur except to objects on the modal form. Программа должна скрывать или закрывать модальную форму (обычно в ответ на какое-либо действие пользователя), прежде чем может произойти ввод в другую форму. The program must hide or close a modal form (usually in response to some user action) before input to another form can occur. Формы, которые отображаются модально, обычно используются в качестве диалоговых окон в приложении. Forms that are displayed modally are typically used as dialog boxes in an application.
С помощью этого свойства можно определить, отображается ли форма, полученная из метода или свойства, модальной. You can use this property to determine whether a form that you have obtained from a method or property has been displayed modally.
Чтобы отобразить форму в модальном режиме, используйте ShowDialog метод. To display a form modally use the ShowDialog method.
Диалоговые окна в Windows Forms Dialog Boxes in Windows Forms
Диалоговые окна используются для взаимодействия с пользователем и получения информации. Dialog boxes are used to interact with the user and retrieve information. Проще говоря, диалоговое окно представляет собой форму со значением ее свойства перечисления FormBorderStyle, установленным в FixedDialog . In simple terms, a dialog box is a form with its FormBorderStyle enumeration property set to FixedDialog . Пользовательские диалоговые окна можно создавать с помощью конструктор Windows Forms в Visual Studio. You can construct your own custom dialog boxes by using the Windows Forms Designer in Visual Studio. Для настройки диалоговых окон под конкретные потребности можно добавить элементы управления, такие как Label , Textbox и Button . Add controls such as Label , Textbox , and Button to customize dialog boxes to your specific needs. .NET Framework также содержит предопределенные диалоговые окна, такие как Открытие файлов и окна сообщений, которые можно адаптировать для собственных приложений. The .NET Framework also includes predefined dialog boxes, such as File Open and message boxes, which you can adapt for your own applications. Дополнительные сведения см. в разделе элементы управления и компоненты диалоговых окон. For more information, see Dialog-Box Controls and Components.
в этом разделе In This Section
Связанные разделы Related Sections
Элементы управления и компоненты диалоговых окон Dialog-Box Controls and Components
Список стандартных элементов управления диалоговых окон. Lists the predefined dialog box controls.
Изменение внешнего вида Windows Forms Changing the Appearance of Windows Forms
Содержит ссылки на разделы, описывающие, как изменить внешний вид приложений Windows Forms. Contains links to topics that describe how to change the appearance of Windows Forms applications.
Общие сведения об элементе управления TabControl TabControl Control Overview
Объясняется, как включить элемент управления «Вкладка» в диалоговое окно. Explains how you incorporate the tab control into a dialog box.
Как вызываются модальные диалоговые окна
?
Я думаю правильный ответ тут: Создается новая форма, которая открывается в виде диалогового окна.
Что делает следующий фрагмент программы:
?
Я думаю правильный ответ тут: Создается новая форма, которая открывается в виде модального диалогового окна.
В общем я думаю, что в первом и во втором вопросе они оба модальные, я права ?
f3.ShowDialog() — это модальный
f3.Show() — это обычный
Диалоговые окна
Добрый вечер. Возникла проблема мне нужно создать приложение, по теме диалоговые окна. Суть.
Диалоговые окна для создания,сохранения
Здравствуйте. У меня такая проблема. Есть кнопка. При нажатии на неё, нужно, чтобы появилось.
Модальные диалоговые окна ООП
Добрый день. Подскажите пожалуйста, как реализовать модальные диалоговые окна в ООП. При реализации.
Как закрывать модальные окна в бутстрап
Добрый день вам. Я новичок в програмировании но уже перечитал кучу документации по jQuery. Не.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Как закрывать диалоговые окна через макрос
Здравствуйте. Мне нужно закрыть два диалоговые окна через команду DialogSheets(«. «).Hide. Выдает.
Как вызвать диалоговые окна из веб-формы?
В виндос-формах есть такие компоненты — «Диалоговые окна». Их используют, к примеру, чтобы открыть.
Как создать диалоговые окна и всплывающие подсказки
как организовать: 1. многоэкранные приложения 2. диалоговые окна и всплывающие подсказки 3.
Как сместить от центра стандартные диалоговые окна MsgBox?
Добрый день, как сместить от центра стандартные диалоговые окна?
Модальное окно windows forms
Как видите, для диалогового окна MessageBox можно выбирать один из четырех значков. Если же эти значки Вам не подходят, придется отказаться от использования диалогового окна MessageBox и создавать свое собственное модальное диалоговое окно.
Параметр defButton метода MessageBox.Show предназначен для выбора кнопки, которая получит фокус сразу после отображения диалогового окна. Этот параметр должен иметь одно из значений перечисления MessageBoxDefaultButton (табл. 5-3).
Таблица 5-3. Перечисление MessageBoxDefaultButton
Номер кнопки, получающей фокус ввода по умолчанию
Если в диалоговом окне отображаются кнопки Yes , No и Cancel , то они будут пронумерованы последовательно: кнопка Yes получит номер 1 (константа Button 1 ), кнопка No — номер 2 (константа Button 2 ), а кнопка Cancel — номер 3 (константа Button 3 ).
И, наконец, последний параметр opt метода MessageBox.Show позволяет задать дополнительные параметры. Эти параметры должны иметь значения из перечисления MessageBoxOptions (табл. 5-4).
Таблица 5-4. Перечисление MessageBoxOptions
Окно с сообщением отображается только на рабочем столе, выбранном по умолчанию (в системах с несколькими рабочими столами)
Текст сообщения выравнивается по правому краю диалогового окна
Текст отображается справа налево
Окно отображается на активном рабочем столе, даже если к системе не подключился ни один пользователь. Данный параметр предназначен для приложений, работающих как сервисы ОС Microsoft Windows
Если в окне диалогового окна MessageBox имеется несколько кнопок, то для того чтобы определить, какую кнопку щелкнул пользователь, программа должна проанализировать значение, возвращенное методом MessageBox.Show .
Метод MessageBox . Show может вернуть одно из нескольких значений перечисления DialogResult (табл. 5-5).
Таблица 5-5. Перечисление DialogResult
Кнопка, при щелчке которой возвращается эта константа
Модальное диалоговое окно продолжает работать
Доработка меню File приложения SimpleNotepad
Вооружившись новыми знаниями относительно перегруженных методов MessageBox.Show , доработаем наше приложение SimpleNotepad (на протяжении этой главы мы будем дорабатывать это приложение, полные исходные тексты после всех доработок Вы найдете в приложении 1 к нашей книге).
Сделаем так, чтобы при попытке создать или загрузить новый документ, когда старый документ не был сохранен, программа запрашивала пользователя о необходимости сохранения старого документа (рис. 5-2).
Рис. 5-2. Запрос на сохранение документа
Если пользователю нужно сохранить старый документ, он должен щелкнуть в диалоговом окне Сохранение документа кнопку Yes . При этом на экране появится диалоговое окно сохранения документа.
В том случае, когда пользователь решил отказаться от сохранения документа, он щелкает кнопку No . При этом в окно редактирования будет загружен новый документ.
И, наконец, кнопка Cancel позволит отказаться от создания или загрузки нового документа и вернуться к редактированию старого документа.
Для реализации этих усовершенствований необходимо внести изменения в методы MenuFileNew , MenuFileOpen и menuFileExit_Click .
Вот новый исходный текст метода MenuFileNew :
///
/// Создание нового файла
/// summary >
private void MenuFileNew ()
<
if ( m _ DocumentChanged )
<
DialogResult result = MessageBox . Show (
«Документ изменен. \nСохранить изменения?»,
«Сохранение документа», MessageBoxButtons.YesNoCancel,
MessageBoxIcon . Warning , MessageBoxDefaultButton . Button 1);
switch ( result )
<
case DialogResult . Yes :
<
MenuFileSaveAs ();
break ;
>
case DialogResult . Cancel :
<
return ;
>
>
>
richTextBox 1. Clear ();
statusBarPanel 2. 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 >
/// Открытие существующего файла
///
private void MenuFileOpen ()
<
if ( m _ DocumentChanged )
<
DialogResult result = MessageBox . Show (
«Документ изменен. \nСохранить изменения?»,
«Сохранение документа», MessageBoxButtons.YesNoCancel,
MessageBoxIcon . Warning , MessageBoxDefaultButton . Button 1);
switch ( result )
<
case DialogResult . Yes :
<
MenuFileSaveAs ();
break ;
>
case DialogResult . Cancel :
<
return ;
>
>
>
if ( openFileDialog 1. ShowDialog () ==
System . Windows . Forms . DialogResult . OK &&
openFileDialog 1. FileName . Length > 0)
<
try
<
richTextBox 1. LoadFile ( openFileDialog 1. FileName ,
RichTextBoxStreamType . RichText );
>
catch ( System . ArgumentException ex )
<
richTextBox 1. LoadFile ( openFileDialog 1. FileName ,
RichTextBoxStreamType . PlainText );
>
this . Text = «Файл [» + openFileDialog 1. 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 .
В этом разделе мы расскажем подробнее о создании собственных модальных окон и приведем примеры приложений, получающих от пользователей данные через такие окна.
Хотя в приложении 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
Почти все эти настройки мы уже использовали для диалогового окна 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 ;
>
>
>
richTextBox 1. Clear ();
statusBarPanel 2. 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. Идентификаторы полей ввода текстовой информации
Оставьте Ваш комментарий
Поле ввода названия любимой ОС
Кроме этого, во всех этих полях сотрите тестовые строки, задающие значение свойства Text и снабдите их поясняющими надписями, как это показано на рис. 5-5.
Так как поле Оставьте Ваш комментарий предназначено для ввода многострочного комментария, установите значение свойства Multiline равным true . После этого Вы сможете отрегулировать не только ширину, но и высоту этого поля.
Далее, установите значение свойства Enabled поля ввода названия любимой ОС t extBoxFavoriteOS , равным false . В этом случае сразу после отображения формы данное поле будет заблокировано. Разблокировка поля будет осуществляться обработчиком событий от флажка Другая (укажите, какая) , т.к. это поле нужно только в том случае, если пользователь отметил этот флажок.
Форма регистрации содержит две группы флажков с независимой фиксацией. Группа флажков Пол позволяет указать пол владельца копии программы, а группа флажков Любимая ОС — название любимой операционной системы владельца.
Заметим, что вторая группа флажков снабжена дополнительным полем ввода текстовой информации. Если пользователю не нравится ни Microsoft Windows , ни Linux , он может отметить флажок Другая (укажите, какая) , а затем ввести название своей любимой ОС в этом дополнительном текстовом поле.
Как видно из названия, из флажков с зависимой фиксацией, принадлежащих одной группе, в отмеченном состоянии может находиться только один флажок. Таким образом, нельзя указать одновременно и мужской, и женский пол, а из любимых ОС можно выбрать только одну.
Для объединения флажков Муж. и Жен. в группу Пол перетащите из инструментальной панели Toolbox элемент управления GroupBox . Запишите строку «Пол» в свойство Text этого элемента управления.
Затем перетащите внутрь окна элемента управления GroupBox два флажка типа RadioButton . Это и есть флажки с зависимой фиксацией. Свое название они получили по аналогии с кнопками радиоприемника, которые можно нажимать только по одной.
Измените надпись около флажков в соответствии с рис. 5-5, отредактировав свойства флажков Text .
Аналогичным образом создайте группу флажков Любимая ОС , добавив в нее три флажка MS Windows , Linux и Другая (укажите, какая) .
Добавив все флажки и расположив их внутри соответствующих окон GroupBox , проверьте их идентификаторы, хранящиеся в свойстве Name , на соответствие табл. 5-8.
Таблица 5-8. Идентификаторы флажков с зависимой фиксацией
Другая (укажите, какая)
Флажки с независимой фиксацией не нужно объединять в группы, т.к. они работают независимо друг от друга. Вам нужно добавить в форму регистрации два таких флажка класса CheckBox , перетащив их мышью из инструментальной панели Toolbox .
Флажок Подписка на новости должен иметь идентификатор checkBoxSendNews , а флажок Подписка на электронную газету — идентификатор checkBoxSendLetter . Таким образом, для этих флажков нужно настроить только свойства Name (идентификатор) и Text (текст, расположенный около флажка).
Для выбора одного значения из нескольких возможных удобен элемент управления 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 нашей формы. В результате форма будет закрыта, а значение, соответствующее щелкнутой кнопке, будет передано вызывающей программе.
Тем не менее, один обработчик событий нам все же придется создать. Речь идет об обработчике событий для флажка Другая (укажите, какая) , входящего в группу флажков Любимая ОС .
Когда пользователь отмечает этот флажок, программа должна разблокировать поле ввода текста t extBoxFavoriteOS , для того чтобы позволить ему ввести название любимой ОС. Аналогично, когда пользователь снимает отметку с данного флажка, программа должна вновь заблокировать поле t extBoxFavoriteOS .
Чтобы создать необходимый обработчик событий, дважды щелкните левой мышью флажок Другая (укажите, какая) . Затем подготовьте исходный текст созданного обработчика событий 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 , флажок отмечен. В этом случае обработчик событий снимает блокировку с поля t extBoxFavoriteOS , записывая в свойство textBoxFavoriteOS.Enabled значение true .
В том случае, когда значение свойства rb.Checked равно false , событие было вызвано тем, что пользователь снял отметку с нашего флажка. В этом случае программа вновь блокирует поле t extBoxFavoriteOS , записывая в свойство 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 . Количество таких элементов хранится в свойстве 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
Преобразование типа выполняется только для флажков, а текстовое поле пропускается.
В том случае, если функция доступа обнаружила отмеченный флажок, она проверяет его идентификатор. В том случае, если пользователь отметил флажок Другая (укажите, какая) , функция доступа читает свойство 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 (
» mail to : 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 , главное окно которого показано на рис. 5-11.
Рис. 5-11. Главное окно приложения PropertyApp
В этом окне располагаются два поля ввода текстовой информации, предназначенных для ввода адресов серверов электронной почты POP 3 и SMTP (первый из них предназначен для приема сообщений электронной почты, а второй — для передачи).
Пользователь имеет возможность ввести эти адреса непосредственно в полях Адрес сервера POP3 и Адрес сервера SMTP , расположенных в главном окне приложения. Но есть и еще одна возможность — пользователь может щелкнуть кнопку Настроить , и затем ввести адреса серверов в появившемся на экране немодальном окне Настройка свойств , показанном на рис. 5-12.
Рис. 5-12. Немодальное окно для ввода адресов почтовых серверов
Наше окно Настройка свойств обладает одним интересным свойством — оно создает события и передает их в главное окно приложения. Событие создается, когда пользователь щелкает кнопку Изменить (рис. 5-12). Обработчик данного события, предусмотренный в классе главного окна приложения, переписывает информацию из полей окна Настройка свойств в соответствующие поля главного окна приложения Серверы электронной почты .
Если пользователь вначале ввел адреса серверов в главном окне приложения, а потом щелкнул расположенную там кнопку Настроить, то эти введенные адреса будут использованы для инициализации полей немодального окна Настройка свойств . Таким образом, с помощью окна Настройка свойств можно отредактировать значения, введенные в главном окне, и сразу же увидеть результат редактирования.
Создавая форму главного окна приложения (рис. 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 button 1_ Click ( object sender , System . EventArgs e )
<
PropertyForm dialog = new PropertyForm ();
dialog . Owner = this ;
dialog . SMTP = this . textBoxSMTP . Text ;
dialog . POP 3 = this . textBoxPOP 3. Text ;
dialog . ApplyHandler += new EventHandler ( PropertyForm _ Apply );
Здесь мы вначале создаем немодальное окно как объект класса PropertyForm , сохраняя ссылку на него в переменной dialog . Далее мы настраиваем свойство Owner , записывая в него ссылку на главное окно приложения:
dialog . Owner = this ;
В результате создаются родительские отношения между главным окном приложения и дочерним немодальным окном.
На следующем этапе обработчик событий button1_Click переписывает текст из полей ввода адресов почтовых серверов в свойства dialog.SMTP и dialog.POP3 немодального диалогового окна:
dialog . SMTP = this . textBoxSMTP . Text ;
dialog . POP 3 = this . textBoxPOP 3. Text ;
Чуть позже мы создадим это окно и определим все его компоненты.
Следующая строка подключает обработчик события PropertyForm_Apply , создаваемого дочерним немодальным окном:
dialog.ApplyHandler += new EventHandler(PropertyForm_Apply);
Подключив обработчик событий, программа отображает дочернее окно на экране методом Show :
Обработчик событий PropertyForm_Apply нужно определить в классе формы главного окна следующим образом:
private void PropertyForm _ Apply ( object sender , System . EventArgs e )
<
PropertyForm dialog = ( PropertyForm ) sender ;
this . textBoxPOP 3. Text = dialog . POP 3;
this . textBoxSMTP . Text = dialog . SMTP ;
>
Задача обработчика событий PropertyForm_Apply сводится к переписыванию адресов почтовых серверов из свойств dialog.POP3 и dialog.SMTP дочернего окна в поля редактирования главного окна. Т.е. этот обработчик предназначен для отображения в главном окне нашей программы информации, введенной пользователем в дочернем немодальном окне.
Теперь мы займемся формой для немодального окна. Создайте эту форму с именем PropertyForm , создав класс с именем PropertyForm .
Расположите в форме текстовые поля ввода адресов почтовых серверов и две кнопки, показанные на рис. 5-12. Идентификаторы текстовых полей ввода Адрес сервера POP3 и Адрес сервера SMTP должны быть, соответственно, textBoxPOP3 и textBoxSMTP .
Кнопка Отменить , предназначенная для закрытия немодального диалогового окна, должна иметь идентификатор buttonCancel , а кнопка Изменить , создающая событие, — идентификатор buttonApply .
Подготовив форму, отредактируйте исходный текст класса PropertyForm .
Прежде всего, добавьте ссылку ApplyHandler на событие, реализованное в виде делегата EventHandler :
///
/// Обработчик события от кнопки Изменить
///
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 , программист может организовать проверку данных, которая будет выполняться в момент завершения ввода в окне того или иного элемента управления. Например, когда пользователь ввел в текстовом поле редактирования адрес электронной почты и нажал клавишу табуляции для перехода к другому полю, программа может проверить этот адрес на наличие формальных ошибок. Если были допущены ошибки, около поля появится значок, сигнализирующий наличие ошибки.
Давайте модифицируем форму регистрации, рассмотренную нами ранее в разделе «Программирование формы регистрации» этой главы, добавив проверку данных, введенных в полях Ф.И.О. и Адрес E-Mail (рис. 5-9).
Прежде всего, откройте окно редактирования свойств редактора textBoxName , предназначенного для ввода имени, фамилии и отчества пользователя (рис. 5-13).
Рис. 5-13. Свойство CausesValidation
Обратите внимание, что значение свойства CausesValidation равно true . В результате, когда окно редактирования textBoxName потеряет фокус ввода (т.е. когда пользователь перейдет к заполнению другого поля формы), будет происходить проверка содержимого формы.
Далее перетащите на поверхность формы из инструментальной панели Toolbox системы Microsoft Visual Studio . NET значок программного компонента ErrorProvider . В результате станет возможной обработка ошибок, допущенных при заполнении полей этой формы.
На следующем этапе Вам нужно создать обработчик события 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)
<
errorProvider 1. SetError ( textBoxName , «Не указано имя»);
>
else
errorProvider 1. 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 , можно настроить его свойства в окне Properties (рис. 5-16).
Рис. 5-16. Свойства компонента ErrorProvider
Рассмотрим самые необходимые свойства.
Отредактировав свойство Icon , Вы сможете заменить стандартный значок ошибки (красный кружок с восклицательным знаком) любым другим значком, добавленным предварительно в проект приложения.
Свойство BlinkRate определяет частоту мигания значка в миллисекундах.
Свойство BlinkStyle задает стиль значка и может иметь следующие значения:
· BlinkIfDifferentError (используется по умолчанию);
Если задать свойству BlinkStyle значение BlinkIfDifferentError , то значок будет мигать, если значок отображался ранее, но текст сообщения об ошибке стал другим.
Использование значения AlwaysBlink приводит к постоянному миганию значка, а значения NeverBlink — к отмене мигания.