Нестандартные формы и стандартные диалоги
Разработка вкладки MessageBox
На этой вкладке нашего упражнения мы испытаем возможности простейшего стандартного диалогового окна MessageBox, которое применяется разработчиками для быстрого оформления сообщений пользователю. Это окно реализуется классом System.Windows.Forms.MessageBox, который имеет 12 перегружаемых статических методов Show() для отображения сообщений в различной форме. Чтобы воспользоваться этим классом, не нужно создавать его экземпляры, а можно сразу вызывать метод MessageBox.Show(), в который помещать нужные аргументы. Перегрузки метода Show() имеют следующий синтаксис
- public static System.Windows.Forms.DialogResult Show ( System.String text )
- public static System.Windows.Forms.DialogResult Show ( System.String text , System.String caption )
- public static System.Windows.Forms.DialogResult Show ( System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons )
- public static System.Windows.Forms.DialogResult Show ( System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons , System.Windows.Forms.MessageBoxIcon icon )
- public static System.Windows.Forms.DialogResult Show ( System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons , System.Windows.Forms.MessageBoxIcon icon , System.Windows.Forms.MessageBoxDefaultButton defaultButton )
- public static System.Windows.Forms.DialogResult Show ( System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons , System.Windows.Forms.MessageBoxIcon icon , System.Windows.Forms.MessageBoxDefaultButton defaultButton , System.Windows.Forms.MessageBoxOptions options )
- public static System.Windows.Forms.DialogResult Show ( System.Windows.Forms.IWin32Window owner , System.String text )
- public static System.Windows.Forms.DialogResult Show ( System.Windows.Forms.IWin32Window owner , System.String text , System.String caption )
- public static System.Windows.Forms.DialogResult Show ( System.Windows.Forms.IWin32Window owner , System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons )
- public static System.Windows.Forms.DialogResult Show ( System.Windows.Forms.IWin32Window owner , System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons , System.Windows.Forms.MessageBoxIcon icon )
- public static System.Windows.Forms.DialogResult Show ( System.Windows.Forms.IWin32Window owner , System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons , System.Windows.Forms.MessageBoxIcon icon , System.Windows.Forms.MessageBoxDefaultButton defaultButton )
- public static System.Windows.Forms.DialogResult Show ( System.Windows.Forms.IWin32Window owner , System.String text , System.String caption , System.Windows.Forms.MessageBoxButtons buttons , System.Windows.Forms.MessageBoxIcon icon , System.Windows.Forms.MessageBoxDefaultButton defaultButton , System.Windows.Forms.MessageBoxOptions options )
В нашей вкладке мы реализуем вызовы наиболее распространенных ( шесть первых в списке ) перегрузок метода MessageBox.Show(). Для этого нам еще понадобятся раскрывающиеся списки ComboBox, текстовые поля TextBox, текстовые метки Label, чтобы выбирать настройки каждой перегрузки. Все перегрузки возвращают значение перечисления System.Windows.Forms.DialogResult, по которому можно определить выбор пользователя.
Параметры метода Show()
Метод MessageBox.Show() в выделенных перегрузках имеет следующие параметры:
- System.String text - сообщение пользователю
- System.String caption - заголовок окна
-
System.Windows.Forms.MessageBoxButtons buttons -
состав кнопок ( перечисление )
- AbortRetryIgnore
- OK
- OKCancel
- RetryCancel
- 18_23No
- 18_23NoCancel
- System.Windows.Forms.MessageBoxIcon icon - пиктограмма ( перечисление )
-
System.Windows.Forms.MessageBoxDefaultButton defaultButton -
кнопка, имеющая при запуске фокус ввода по умолчанию
( перечисление )
- Button1
- Button2
- Button3
-
System.Windows.Forms.MessageBoxOptions options -
настройки ( перечисление )
- DefaultDesktopOnly
- RightAlign
- RtlReading
- ServiceNotification
Все перечисленные настройки мы реализуем в нашей вкладке, чтобы продемонстрировать, как они выглядят.
Разработка итерфейса вкладки MessageBox
Оформим вкладку MessageBox, чтобы удобно было испытывать стандартное окно сообщений.
- Разместите на вкладке MessageBox элементы управления и частично оформите их, как показано на снимке
Программирование вкладки MessageBox
- Заполните свойство Items элемента comboBox1 следующими строками
1) MessageBox.Show(text); 2) MessageBox.Show(text, caption); 3) MessageBox.Show(text, caption, buttons); 4) MessageBox.Show(text, caption, buttons, icon); 5) MessageBox.Show(text, caption, buttons, icon, defaultButton); 6) MessageBox.Show(text, caption, buttons, icon, defaultButton, options);Листинг 18.13. Строки для выбора перегрузки метода Show() в свойстве Items элемента comboBox1
- Заполните свойство Items элемента comboBox2 следующими строками
AbortRetryIgnore OK OKCancel RetryCancel 18_23No 18_23NoCancelЛистинг 18.14. Строки для выбора кнопок метода Show() в свойстве Items элемента comboBox2
- Заполните свойство Items элемента comboBox3 следующими строками
Asterisk Error Exclamation Hand Information None Question Stop WarningЛистинг 18.15. Строки для выбора пиктограмм метода Show() в свойстве Items элемента comboBox3
- Заполните свойство Items элемента comboBox4 следующими строками
Button1 Button2 Button3Листинг 18.16. Строки для кнопок по умолчанию метода Show() в свойстве Items элемента comboBox4
- Заполните свойство Items элемента comboBox5 следующими строками
DefaultDesktopOnly RightAlign RtlReading ServiceNotificationЛистинг 18.17. Строки для опций метода Show() в свойстве Items элемента comboBox5
-
Выделите
на вкладке MessageBox все списки и
текстовые поля (текстовые
метки Label оставьте в покое ),
входящие в контейнер groupBox1.
Установите для них следующие значения свойств:
- Text = ПУСТО
- Enabled = False
- Проверьте, что для элемента comboBox1 установлено свойство Enabled = True
- Создайте для элемента comboBox1 обработчик события SelectedIndexChanged с именем comboBox1_SelectedIndexChanged(), который заполните так
private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e) { // Перебираем все элементы контейнера groupBox1 // и все, кроме текстовых меток, делаем недоступными foreach(Control box in groupBox1.Controls) { String type = box.GetType().ToString(); // Выделяем чистый тип без пути type = type.Substring(type.LastIndexOf('.') + 1); if( type == "Label") continue; else box.Enabled = false; } // Открываем нужные списки параметров // Организуем цепочку выбора switch(comboBox1.SelectedIndex + 1) { case 6: comboBox5.Enabled = true; goto case 5; case 5: comboBox4.Enabled = true; goto case 4; case 4: comboBox3.Enabled = true; goto case 3; case 3: comboBox2.Enabled = true; goto case 2; case 2: textBox2.Enabled = true; goto case 1; case 1: textBox1.Enabled = true; break; } }Листинг 18.18. Обработчик события SelectedIndexChanged элемента comboBox1
В этом коде при каждом новом выборе пользователя в списке comboBox1 мы вначале закрываем все списки и текстовые поля для параметров, затем открываем нужные в зависимости от выбранного варианта. Здесь мы вынужденно используем оператор перехода goto, так как синтаксис C# требует, чтобы непустое тело каждого варианта case заканчивалось break или goto. В языке C++ обязательного выполнения этого условия не требуется. Но пустые case могут следовать друг за другом перед первым непустым.
- Задайте кнопке значение Name = btnShow и создайте для нее обработчик. Заполните обработчик так
private void btnShow_Click(object sender, EventArgs e) { // Проверяем, выбрана ли перегрузка if (comboBox1.Text == "") { MessageBox.Show("Выберите перегрузку метода Show()"); return; } // Проверяем, все ли параметры заданы foreach (Control box in groupBox1.Controls) { String type = box.GetType().ToString(); type = type.Substring(type.LastIndexOf('.') + 1); // Пропускаем метки и все закрытые элементы if (type == "Label" || box.Enabled == false) continue; // Убираем пробелы и определяем, что незаполнено else if (box.Text.Trim().Length <= 0) { MessageBox.Show("Задайте все необходимые параметры"); return; } } // Формируем массивы ссылок на перечисления MessageBoxButtons[] buttons = { MessageBoxButtons.AbortRetryIgnore, MessageBoxButtons.OK, MessageBoxButtons.OKCancel, MessageBoxButtons.RetryCancel, MessageBoxButtons.18_23No, MessageBoxButtons.18_23NoCancel }; MessageBoxIcon[] icon = { MessageBoxIcon.Asterisk, MessageBoxIcon.Error, MessageBoxIcon.Exclamation, MessageBoxIcon.Hand, MessageBoxIcon.Information, MessageBoxIcon.None, MessageBoxIcon.Question, MessageBoxIcon.Stop, MessageBoxIcon.Warning }; MessageBoxDefaultButton[] defaultButton = { MessageBoxDefaultButton.Button1, MessageBoxDefaultButton.Button2, MessageBoxDefaultButton.Button3 }; MessageBoxOptions[] options = { MessageBoxOptions.DefaultDesktopOnly, MessageBoxOptions.RightAlign, MessageBoxOptions.RtlReading, MessageBoxOptions.ServiceNotification }; // Безопасно отображаем простое диалоговое окно сообщений try { switch (comboBox1.SelectedIndex) { case 0: MessageBox.Show(textBox1.Text); break; case 1: MessageBox.Show(textBox1.Text, textBox2.Text); break; case 2: MessageBox.Show(textBox1.Text, textBox2.Text, buttons[comboBox2.SelectedIndex]); break; case 3: MessageBox.Show(textBox1.Text, textBox2.Text, buttons[comboBox2.SelectedIndex], icon[comboBox3.SelectedIndex]); break; case 4: MessageBox.Show(textBox1.Text, textBox2.Text, buttons[comboBox2.SelectedIndex], icon[comboBox3.SelectedIndex], defaultButton[comboBox4.SelectedIndex]); break; case 5: MessageBox.Show(textBox1.Text, textBox2.Text, buttons[comboBox2.SelectedIndex], icon[comboBox3.SelectedIndex], defaultButton[comboBox4.SelectedIndex], options[comboBox5.SelectedIndex]); break; } } catch (System.Exception exc) { MessageBox.Show("Внимательно проверьте параметры метода!" + Environment.NewLine + exc.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Stop); } }Листинг 18.19. Обработчик для кнопки btnShow
Здесь мы применили операторы обработки исключений try ( попытка ) ... catch ( ловушка ), которые позволяют сделать код более безопасным.
И последнее, что необходимо сделать для вкладки MessageBox, - запретить редактирование списков пользователем. Здесь мы полностью этого не достигнем, поскольку клавиша Del всегда остается доступной для редактирования поля списка ComboBox.
- Выделите все раскрывающиеся списки ComboBox в контейнере groupBox1 (текстовые поля не трогайте!) и задайте вручную для их события KeyPress имя обработчика lockBox_KeyPress, который заполните так
// Запрещаем раскрывающиеся списки для редактирования private void lockBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { e.Handled = true; }Листинг 18.20. Обработчик для запрета редактирования списков пользователем
- Заключите код для вкладки MessageBox в секционные скобки для удобства редактирования
#region Вкладка MessageBox .............................................. #endregionЛистинг 18.21. Создание секции для кода вкладки MessageBox
- Постройте приложение и испытайте работу вкладки MessageBox. Все должно работать, как мы задумали.
Этап тестирования программы - наиболее ответственный при ее создании. Специально составляют карты испытаний, где предусматривают все возможные ситуации, в которых программа может оказаться. Здесь очень важно привлекать к этому реальных пользователей на самых начальных стадиях работы. Только они могут найти и вовремя подсказать возможные ошибки.
Не стесняйтесь советываться с пользователями на всех стадиях разработки, выпытывайте все, что вам может помочь. Чувствуя себя соучастниками, они с удовольствием будут вам помогать. Прикидывайтесь несведующими в их предметной области, всячески показывайте свое восхищение их профессионализмом - это им будет льстить и повышать расположение, а вам облегчит жизнь и поможет создать не только хорошую программу, но и хорошую репутацию. Конечно, и вы должны быть мастером своего дела, серьезные пользователи это сразу чувствуют.