Шаг 199.
Microsoft Visual C++ 2010. Язык С/С++.
Компоненты Windows Forms. Компонент ErrorProvider

Содержимое этого шага базируется на:
  1. https://metanit.com/sharp/windowsforms/4.22.php
  2. https://it.wikireading.ru/31327
  3. http://programming-lang.com/ru/comp_programming/troelsen/0/j1880.html

    На этом шаге мы рассмотрим назначение и использование этого компонента.

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

    Свойства этого компонента приведены на рисунке 1.


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

    Среди его свойств можно выделить следующие:

    Рассмотрим пример использования этого компонента.

    Расположим на форме два компонента TextBox, которые будут использоваться для ввода имени и возраста. Добавим к ним компонент ErrorProvider, которому "поручим" отвечать за правильность ввода данных. Форма в режиме конструктора приведена на рисунке 3.


Рис.3. Форма в режиме конструктора

    Прежде, чем переходить к написанию обработчиков, отметим, что практически у каждого компонента есть свойство CausesValidation, которое "отвечает" за возможность компонента вызывать проверку ввода данных, при необходимости реализации такой проверки. Это возможно, когда свойство CausesValidation имеет значение True. Компоненты TextBox имеют отмеченное свойство, и по умолчению его значение как раз равно True.

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

    Следовательно,

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

// Проверка на правильность ввода имени пользователя
private: System::Void textBox1_Validating(System::Object^  sender, 
     System::ComponentModel::CancelEventArgs^  e) {
	 if (textBox1->Text->Length == 0)
       {
		// Связывание компонента и выводимой подсказки
             errorProvider1->SetError(textBox1, "Не указано имя!");
       }
       else if (textBox1->Text->Length < 4)
       {
		// Связывание компонента и выводимой подсказки
             errorProvider1->SetError(textBox1, "Слишком короткое имя!");
       }
       else
       {
		// Очистка параметров компонента
             errorProvider1->Clear();
       }
 }
// Проверка на правильность ввода возраста
private: System::Void textBox2_Validating(System::Object^  sender, 
   System::ComponentModel::CancelEventArgs^  e) {
	 int age = 0;
	 if (textBox2->Text->Length == 0)
	 {
		 // Связывание компонента и выводимой подсказки
		 errorProvider1->SetError(textBox2, "Не указан возраст!");
	 }
	 else 
		 // Пытаемся перевести строку в число
		 if (!System::Int32::TryParse(textBox2->Text, age))
		 {
			 // Связывание компонента и выводимой подсказки
			 errorProvider1->SetError(textBox2, "Некорректный возраст!");
		 }
		 else
		 {
			 // Очистка параметров компонента
			 errorProvider1->Clear();
		 }
 }
Архив проекта можно взять здесь.

    Здесь:

    В приведенном приложении есть небольшая деталь - валидация элемента будет происходить, когда мы завершим ввод и перейдем на другой элемент. Если же нам надо валидировать элемент по мере ввода, то тогда мы можем обрабатывать событие TextChanged у тех же текстовых полей.

    Результат работы приложения изображен на рисунке 4.


Рис.4. Результат работы приложения

    На следующем шаге мы рассмотрим компонент MonthCalendar.




Предыдущий шаг Содержание Следующий шаг