Создание пользовательских (композитных) элементов управления. Элемент управления NumericUpDown
Одинаковая группа элементов с привязанными обработчиками может требоваться в нескольких частях большого приложения или даже нескольких приложений. Например, программы Microsoft Word и Excel содержат много одинаковых связанных элементов — панели инструментов, окна настроек, группы меню. Среда Visual Studio .NET предоставляет возможность создания функциональных блоков, состоящих из многих элементов; применение этих блоков позволяет значительно ускорить разработку приложений. Создаем новый проект в Visual Studio .NET — на этот раз выбираем шаблон Windows Control Library (рис. 3.11).
Рис. 3.11. Проект UserInput, шаблон проекта — Windows Control Library
Появляется форма без границ, представляющая собой основу, на которой будут располагаться элементы. В принципе, можно разрабатывать функциональность и проверять код, компилируя проект при помощи пункта меню Build (Ctrl+Shift+B). Однако при этом мы не увидим результатов работы композитного элемента, пока не добавим его на другую форму. Поэтому на время разработки переделаем проект в Windows-приложение, а потом, когда все будет готово, вернем ему исходный вид. При попытке запустить приложение появляется сообщение "A project with an Output Type of Class Library cannot be started directly" (Проект с выходным типом Class Library (Библиотека классов) не может быть запущен непосредственно). В окне Solution Explorer щелкаем правой кнопкой на имени проекта UserInput и в появившемся контекстном меню выбираем Properties. В окне UserInput Property Pages изменяем значение свойства OutputType на Windows Application. Снова запускаем приложение. Появляется ошибка — приложение не содержит точки входа:
Program 'D:\Uchebnik\Code\Glava3\UserInput\obj\Debug \UserInput.exe' does not have an entry point defined
Добавляем метод Main в класс формы:
[STAThread] static void Main() { Application.Run(new UserControl1()); }
Снова запускаем приложение — появляются две ошибки:
1.D:\Uchebnik\Code\Glava3\UserInput\UserControl1.cs(44): The best overloaded method match for'System.Windows.Forms.Application.Run(System.Windows.Forms.Form)' has some invalid arguments
2.D:\Uchebnik\Code\Glava3\UserInput\UserControl1.cs(44): Argument '1': cannot convert from 'UserInput.UserControl1' to 'System.Windows.Forms.Form'
Класс UserControl1 наследует от класса UserControl:
public class UserControl1 : System.Windows.Forms.UserControl
Обычный класс Windows-приложения наследует от класса Form:
public class Form1 : System.Windows.Forms.Form
Закомментируем наследование этого класса (не удалим!) и добавим наследование от класса Form:
public class UserControl1 : System.Windows.Forms.Form
Вид формы в режиме дизайна изменится на стандартный шаблон — с заголовком, который теперь запускается. Итак, для преобразования композитной формы мы изменили выходной тип проекта, добавили метод Main и изменили наследование классов. Проделав обратные шаги, мы можем получить снова композитную форму или преобразовать обычную форму в композитную.
Займемся теперь созданием функциональности. Добавляем на форму три надписи, текстовое поле, ErrorProvider и элемент управления NumericUpDown (рис. 3.12):
Рис. 3.12. Проект UserInput, расположение элементов управления на форме
Две надписи будут статичными, а на третью будут выводиться сообщения при ошибках. Установим свойству Name этой надписи значение lbloutput. Устанавливаем следующие значения текстового поля, элементов ErrorProvider и NumericUpDown:
Name | txtName |
Text |
Name | numUDAge |
Maximum | 100 |
Minimum | 1 |
Value | 25 |
BlinkStyle | AlwaysBlink |
Icon | Code\Glava3\UserInput\Icon\none.ico |
Проверять ввод значений будем в текстовом поле и элементе NumericUpDown. В окне Properties создаем обработчиков событий Validated элементов:
Листинг 3.4.
(html, txt)
Осталось добавить методы, в которых проверяются заданные значения:
private bool nameValid() { // Проверяем заполнение текствого поля return ( txtName.Text.Length > 0); }
private bool ageLess() { //Возраст меньше 25 return (numUDAge.Value < 25); }
private bool ageMore() { //Возраст больше 25 return (numUDAge.Value > 65 ); }
Запускаем приложение. При ошибках иконка мигает беспрерывно, в случае ее исправления сообщение исчезает (рис. 3.13):
Рис. 3.13. Готовое приложение UserInput
Преобразуем теперь проект в композитный элемент, скомпилируем его в режиме Build (Ctrl+Shift+B) и закроем.
На диске, прилагаемом к книге, вы найдете приложение UserInput (Code\Glava3\UserInput).
on_load_lecture()
« |
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
вопросы | »
учебники
|
для печати и PDA
Курсы | Учебные программы | Учебники | Новости | Форум | Помощь Телефон: +7 (495) 253-9312, 253-9313, факс: +7 (495) 253-9310, email: info@intuit.ru © 2003-2007, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование |
2.D:\Uchebnik\Code\Glava3\UserInput\UserControl1.cs(44): Argument '1': cannot convert from 'UserInput.UserControl1' to 'System.Windows.Forms.Form'
Класс UserControl1 наследует от класса UserControl:
public class UserControl1 : System.Windows.Forms.UserControl
Обычный класс Windows-приложения наследует от класса Form:
public class Form1 : System.Windows.Forms.Form
Закомментируем наследование этого класса (не удалим!) и добавим наследование от класса Form:
public class UserControl1 : System.Windows.Forms.Form
Вид формы в режиме дизайна изменится на стандартный шаблон — с заголовком, который теперь запускается. Итак, для преобразования композитной формы мы изменили выходной тип проекта, добавили метод Main и изменили наследование классов. Проделав обратные шаги, мы можем получить снова композитную форму или преобразовать обычную форму в композитную.
Займемся теперь созданием функциональности. Добавляем на форму три надписи, текстовое поле, ErrorProvider и элемент управления NumericUpDown (рис. 3.12):
Рис. 3.12. Проект UserInput, расположение элементов управления на форме
Две надписи будут статичными, а на третью будут выводиться сообщения при ошибках. Установим свойству Name этой надписи значение lbloutput. Устанавливаем следующие значения текстового поля, элементов ErrorProvider и NumericUpDown:
Name | txtName |
Text |
Name | numUDAge |
Maximum | 100 |
Minimum | 1 |
Value | 25 |
BlinkStyle | AlwaysBlink |
Icon | Code\Glava3\UserInput\Icon\none.ico |
Проверять ввод значений будем в текстовом поле и элементе NumericUpDown. В окне Properties создаем обработчиков событий Validated элементов:
private void txtName_Validated(object sender, System.EventArgs e) { if(nameValid()) { // Все правильно, удаляем сообщение с надписи errorProvider1.SetError(txtName, ""); } else { //Поле не заполнено — выводим сообщение errorProvider1.SetError(txtName, "Name is required."); lbloutput.Text = "Введите имя!"; }
}
private void numUDAge_Validated(object sender, System.EventArgs e) { if (ageLess()) { // Введенное значение меньше 25 errorProvider1.SetError(numUDAge, "Age not old enough"); lbloutput.Text = " Введите значение, большее или равное 25"; } else if (ageMore()) { /// Введенное значение больше 25 errorProvider1.SetError(numUDAge, "Age is too old"); lbloutput.Text = "Введите значение, меньшее или равное 65"; } else { // Все правильно, удаляем сообщение с надписи errorProvider1.SetError(numUDAge, ""); }
}
Листинг 3.4.
Осталось добавить методы, в которых проверяются заданные значения:
private bool nameValid() { // Проверяем заполнение текствого поля return ( txtName.Text.Length > 0); }
private bool ageLess() { //Возраст меньше 25 return (numUDAge.Value < 25); }
private bool ageMore() { //Возраст больше 25 return (numUDAge.Value > 65 ); }
Запускаем приложение. При ошибках иконка мигает беспрерывно, в случае ее исправления сообщение исчезает (рис. 3.13):
Рис. 3.13. Готовое приложение UserInput
Преобразуем теперь проект в композитный элемент, скомпилируем его в режиме Build (Ctrl+Shift+B) и закроем.
На диске, прилагаемом к книге, вы найдете приложение UserInput (Code\Glava3\UserInput).