Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Благодарности 9 страница
Рис. 4-46. Создаем обработчик события MunuSelect Здесь находится список событий и обработчиков для них. Назначьте для события Select обработчик MenuSelect, щелкнув соответствующую строку списка дважды левой клавишей мыши или введя его имя с клавиатуры, как это показано на рис. 4-45. После того как Вы нажмете клавишу Enter, будет создано пустое тело обработчика события MenuSelect: private void MenuSelect(object sender, System.EventArgs e) } На данном этапе наш обработчик будет вызываться только тогда, когда пользователь раскроет меню File. Теперь нам нужно подключить этот обработчик ко всем строкам главного меню приложения с целью обработки события Select. Для этого Вам нужно по очереди выделить все строки меню нашего приложения, а затем для каждой строки выбрать в только что упомянутом окне Properties из списка события Select обработчик события MenuSelect (рис. 4-47). Рис. 4-47. Выбираем из меню обработчик события MunuSelect После этого обработчик события MenuSelect будет получать управление всякий раз, когда пользователь выбирает из меню любую строку. Далее измените исходный текст метода MenuSelect следующим образом: private void MenuSelect(object sender, System.EventArgs e) Здесь мы вначале используем первый параметр метода с именем sender, через который передается ссылка на объект, вызвавший появление события. В нашем случае это будет строка меню, выбранная пользователем. Программа преобразует эту ссылку к типу MenuItem, предназначенному для хранения такого рода ссылок, и записывает ее в переменную mi: MenuItem mi = (MenuItem)sender; Далее программа анализирует текст строки меню, хранящийся в свойстве mi.Text, с помощью оператора switch. В зависимости от того, какая строка меню вызвала событие, в переменную ms записывается тот или иной текст, поясняющий назначение данной строки меню. Затем этот текст записывается в левую панель строки состояния statusBarPanel1: statusBarPanel1.Text = ms; Что же касается правой панели строки состояния statusBarPanel2, то в запись него выполняется обработчиком события richTextBox1_TextChanged. Измените его следующим образом: private void richTextBox1_TextChanged(object sender, Напомним, что этот обработчик получает управление, когда пользователь изменяет содержимое окна редактирования. При этом в правой панели строке состояния будет отображаться слово «Изменено» (рис. 4-48). Рис. 4-48. Теперь строка состояния нашего приложения работает Для того чтобы очистить правую панель строки состояния после создания нового документа, загрузки и сохранения документа, модифицируйте обработчики сообщений menuFileNew_Click, а также методы MenuFileOpen и MenuFileSaveAs, как это показано ниже: private void menuFileNew_Click(object sender, System.EventArgs e) richTextBox1.Clear(); private void MenuFileOpen() Во все эти методы необходимо добавить следующую строку, очищающую правую панель строки состояния: statusBarPanel2.Text = " "; Визуальное проектирование приложений 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( Параметры метода MessageBox.Show Рассмотрим назначение отдельных параметров метода MessageBox.Show. Параметр caption позволяет задать текст заголовка диалогового окна MessageBox. С помощью параметра btns Вы можете указать, какие кнопки необходимо расположить в окне диалогового окна. Этот параметр задается константами из перечисления MessageBoxButtons (табл. 5-1). Таблица 5-1. Перечисление MessageBoxButtons
Параметр icon метода MessageBox.Show позволяет выбрать один из нескольких значков для расположения в левой части диалогового окна. Он задается в виде константы перечисления MessageBoxIcon (табл. 5-2). Таблица 5-2. Перечисление MessageBoxIcon
Как видите, для диалогового окна MessageBox можно выбирать один из четырех значков. Если же эти значки Вам не подходят, придется отказаться от использования диалогового окна MessageBox и создавать свое собственное модальное диалоговое окно. Параметр defButton метода MessageBox.Show предназначен для выбора кнопки, которая получит фокус сразу после отображения диалогового окна. Этот параметр должен иметь одно из значений перечисления MessageBoxDefaultButton (табл. 5-3). Таблица 5-3. Перечисление MessageBoxDefaultButton
Если в диалоговом окне отображаются кнопки Yes, No и Cancel, то они будут пронумерованы последовательно: кнопка Yes получит номер 1 (константа Button1), кнопка No — номер 2 (константа Button2), а кнопка Cancel — номер 3 (константа Button3). И, наконец, последний параметр opt метода MessageBox.Show позволяет задать дополнительные параметры. Эти параметры должны иметь значения из перечисления MessageBoxOptions (табл. 5-4). Таблица 5-4. Перечисление MessageBoxOptions
Возвращаемое значение Если в окне диалогового окна 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> switch(result) richTextBox1.Clear(); Напомним, что при изменении содержимого окна редактирования в переменную 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> switch(result) if(openFileDialog1.ShowDialog() == … private void menuFileExit_Click(object sender, System.EventArgs e) switch(result) Мы оставляем Вам эти методы для самостоятельного изучения. Создание модальных окон Как мы уже говорили, помимо только что рассмотренного модального диалогового окна класса 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
Почти все эти настройки мы уже использовали для диалогового окна 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) private void buttonNo_Click(object sender, System.EventArgs e) private void buttonCancel_Click(object sender, System.EventArgs e) Действия, выполняемые этими обработчиками событий, на первый взгляд не очевидны. Расскажем о том, что же здесь происходит. В каждом из обработчиков событий мы присваиваем свойству DialogResult формы нашего диалогового окна одно из значений перечисления DialogResult. Когда это происходит, форма исчезает с экрана, а метод ShowDialog, с помощью которого окно диалоговой панели отображается на экране, возвращает значение свойства DialogResult. Отображение формы Итак, мы добавили к проекту приложения SimpleNotepad новую форму и настроили ее должным образом. Теперь измените исходный текст методов MenuFileNew, MenuFileOpen и menuFileExit_Click. Ниже мы привели новый исходный текст метода MenuFileNew: private void MenuFileNew() switch(result) richTextBox1.Clear(); По сравнению с предыдущим вариантом этого метода мы заменили вызов метода MessageBox.Show следующими строками, отображающими на экране диалоговое окно Сохранение документа, показанное на рис. 5-3: SaveDocumentNeededForm dialog = new SaveDocumentNeededForm(); Обратите внимание, что значение, возвращенное методом 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, обработка событий от этих кнопок сильно упрощается. Фактически для этого Вам не нужно писать вручную ни одной строчки кода.
|