Работа с элементом ErrorProvider в C#

User Rating: 5 / 5

Доброго времени суток, друзья. В этой статье мы посмотрим на то, как работать с элементом ErrorProvider в C#

Элемент ErrorProvider помогает проверять корректность ввода в полях формы и отображать ошибку пользователю приложения, если ввод неверен. К примеру, с помощью ErrorProvider можно проверить текст в каком-нибудь текстовом поле на форме (хотя проверку не обязательно делать именно для текстовых полей - в общем случае вы можете использовать любой элемент, который наследуется от стандартного класса Control).

На панели стандартных элементов он представлен следующим образом:

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

Наша программа будет содержать одну простую форму для ввода некоторого имени (например, это может быть имя пользователя для отправки каких-то данных). Имя можно будет вводить только кириллицей (латинские буквы, цифры и спецсимволы будут запрещены к вводу), а элемент ErrorProvider будет показывать иконку ошибки и текст сообщения с описанием ошибки рядом с текстовым полем, если пользователь заполнил поле неверно. Также на тестовой форме будут кнопки "Отправить" и "Выход". При нажатии на "Отправить" просто выведем тестовое сообщение, а "Выход" будет отвечать за завершение программы.

Так будет выглядеть наша программа при корректном вводе имени, когда использована кириллица:

Как видим, кнопка "Отправить" доступна для нажатия и нет никаких иконок и сообщений об ошибках.

А так будет выглядеть форма при вводе имени латинскими буквами:

Заметим, что кнопка "Отправить" недоступна, а рядом с текстовым полем присутствует иконка с ошибкой (она как раз и выводится при помощи элемента ErrorProvider). Кроме этого, если навести курсор мыши на иконку, мы будем видеть сообщение об ошибке:

Итак, разберём по шагам написание нашего тестового приложения.

Создание нового проекта

Создайте новый проект в среде разработки Microsoft Visual Studio для языка C#, а тип проекта выберите "Приложение Windows Forms (.NET Framework)". В качестве имени проекта укажите ErrorProviderSample.

После создания проекта в окне "Обозреватель решений" выделите файл формы Form1.cs и переименуйте его в FrmErrorProviderSample.cs

Должно получиться следующее:

 

Настройка главной формы и размещение элементов форме

Для главной формы установим следующие значения свойств:

  • FormBorderStyle - FixedSingle
  • Text - [Allineed.Ru] Пример работы с элементом ErrorProvider
  • Size - 579; 162
  • StartPosition - CenterScreen
  • Name - FrmErrorProviderSample
  • MaximizeBox - False
  • MinimizeBox - False

Теперь на главную форму приложения из панели элементов поместим следующие элементы:

  • 1 элемент Label
  • 2 элемента Button
  • 1 элемент TextBox
  • 1 элемент ErrorProvider

и установим для них следующие свойства:

элемент Label:

  • Text - Введите имя:
  • Location - 21; 21
  • Name - LabelName

1-й элемент Button:

  • Text - &Отправить
  • Location - 342; 72
  • Size - 100; 23
  • Name - ButtonSubmit

2-й элемент Button:

  • Text - &Выход
  • Location - 448; 72
  • Size - 75; 23
  • Name - ButtonExit

элемент TextBox:

  • Location - 24; 37
  • Size - 499; 20
  • Name - TextBoxName

элемент ErrorProvider:

  • Name - ErrorProviderForName

Программирование элементов формы

Дважды кликнем на кнопке "Выход" из представления конструктора формы - сгенерируется метод-обработчик с именем ButtonExit_Click, который будет вызываться при каждом нажатии кнопки "Выход". В него пропишем вызов Application.Exit() для завершения приложения:

        private void ButtonExit_Click(object sender, EventArgs e) {
            Application.Exit();
        }

Аналогичным образом дважды кликнем по кнопке "Отправить" из конструктора формы и пропишем в его обработчик нажатия следующий код:

        private void ButtonSubmit_Click(object sender, EventArgs e) {
            MessageBox.Show("Привет, " + TextBoxName.Text + "! Спасибо за корректный ввод.", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);            
        }

Здесь мы по нажатию на кнопку "Отправить" просто выводим диалоговое окно с сообщением пользователю о том, что его ввод был корректен. В параметрах к методу Show() класса MessageBox передаются - текст сообщения, заголовок диалогового окна, комбинация кнопок на диалоговом окне (только кнопка OK) и иконка, которая в нашем случае будет отражать, что это информационное сообщение (тип иконки - MessageBoxIcon.Information).

Выглядеть это будет примерно так:

Если попробовать запустить приложение на данном этапе, то в текстовое поле можно вводить что угодно, и при нажатии на кнопку "Отправить" этот введённый текст будет отображён в диалоговом окне.

Но мы хотим посмотреть на работу элемента ErrorProvider и его возможности. Приступим к реализации этой части.

Вернёмся в представление конструктора формы и дважды кликнем на текстовом поле - в результате будет сгенерирован метод-обработчик события TextChanged. Это событие вызывается каждый раз, когда каким-либо образом изменяется содержимое текстового поля, т.е. при вводе символов в поле. Мы хотим на этом этапе проверять, что именно введено в поле, и, если ввод содержит что-то недопустимое (латинские буквы, цифры или спецсимволы), то мы задействуем возможности элемента ErrorProvider.

Проверку корректности ввода мы будем делать при помощи регулярных выражений. Это отдельная большая и сложная тема, поэтому в данной статье она не разбирается, лишь в общих чертах будет описано, как работают регулярные выражения.

Чтобы регулярные выражения были доступны в коде нашей формы, в самом верху кода формы пропишем следующий импорт:

using System.Text.RegularExpressions;

Это сделает для нас доступными классы, необходимые для работы с регулярными выражениями, в частности Regex и MatchCollection, которые нам понадобятся.

Теперь напишем следующий код в обработчике события TextChanged:

        private void TextBoxName_TextChanged(object sender, EventArgs e) {
            Regex regexMatchAnyCyrillicChar = new Regex(@"(.*[a-zA-Z0-9\W]+.*)|(^[а-я]+.*$)");

            MatchCollection regexMatches = regexMatchAnyCyrillicChar.Matches(TextBoxName.Text);

            if (regexMatches.Count > 0) {                
                ErrorProviderForName.SetError(TextBoxName, "Вводите имя в кириллице, с большой буквы. Латинские буквы, цифры и спецсимволы запрещены.");
                ErrorProviderForName.SetIconPadding(TextBoxName, 10);
                TextBoxName.ForeColor = Color.Red;                
            } else {                
                TextBoxName.ForeColor = SystemColors.WindowText;
                ErrorProviderForName.Clear();                
            }
            EnableDisableSubmitButton();
        }

Здесь разберём детально, что именно происходит. Сначала мы создаём объект регулярного выражения:

Regex regexMatchAnyCyrillicChar = new Regex(@"(.*[a-zA-Z0-9\W]+.*)|(^[а-я]+.*$)");

Внутри конструктора для класса Regex передаётся строка, которая задаёт шаблон (pattern) для регулярного выражения. Он состоит из группы двух круглых скобок, разделённых вертикальной чертой. Это форма записи обозначает альтернативы - т.е. проверяемая нами строка может соответствовать правилам из первой группы скобок, либо правилам из второй группы. В самих скобках задаются те символы, которые мы в нашем примере считаем запрещёнными для ввода пользователем - запись [a-ZA-Z0-9\W]+ обозначает "один или более символ из тех, что не относятся к символам кириллицы". Слева и справа от диапазона стоят выражения .*, которые обозначают "любое количество любых символов". Во второй группе скобок у нас задано выражение ^[а-я]+.*$ и оно обозначает следующее - "строка обязательно начинается с какой-то маленькой кириллической буквы и далее идут любые другие символы". Это правило нужно, чтобы запретить ввод имени с маленькой буквы.

Следующей строкой идёт:

MatchCollection regexMatches = regexMatchAnyCyrillicChar.Matches(TextBoxName.Text);

Она проверяет соответствие введённого текста в текстовом поле при помощи вызова метода Matches() для объекта регулярного выражения и возвращает результат в виде объекта класса MatchCollection. Далее нам остаётся лишь проверить количество совпадений - если оно больше 0, значит ввод ошибочный (поскольку шаблоном регулярного выражения мы задавали правила для недопустимого ввода). И наоборот, если 0 совпадений, то пользователь ввёл кириллические буквы, причём имя начинается с большой буквы, как мы и хотим.

Теперь самое интересное - работа с элементом ErrorProvider. В следующих строках мы устанавливаем ошибку для текстового поля при помощи вызова метода SetError(), а также устанавливаем отступ (padding) для иконки - от правого края текстового поля и устанавливаем цвет шрифта для поля в красный (для индикации ошибочного ввода):

                ErrorProviderForName.SetError(TextBoxName, "Вводите имя в кириллице, с большой буквы. Латинские буквы, цифры и спецсимволы запрещены.");
                ErrorProviderForName.SetIconPadding(TextBoxName, 10);
                TextBoxName.ForeColor = Color.Red;    

В случае же, когда ошибки нет, мы сбрасываем цвет шрифта на системный - SystemColors.WindowText и очищаем наш экземпляр ErrorProvider при помощи метода Clear():

                TextBoxName.ForeColor = SystemColors.WindowText;
                ErrorProviderForName.Clear();     

Очистка приведёт к сокрытию иконки с ошибкой справа от текстового поля, это значит, что ввод корректен.

Последней строкой идёт вызов ещё несуществующего метода EnableDisableSubmitButton(), он у нас ещё не написан, и давайте добавим его к форме. Он будет регулировать доступность кнопки "Отправить", в зависимости от наличия/отсутствия ошибки при вводе:

        private void EnableDisableSubmitButton() {
            string currentError = ErrorProviderForName.GetError(TextBoxName);
            ButtonSubmit.Enabled = currentError.Length == 0 && TextBoxName.TextLength > 0;
        }

Он использует вызов GetError() для элемента ErrorProvider, передавая ему экземпляр текстового поля - для того, чтобы получить текст текущей ошибки в строковую переменную currentError. С её помощью мы проверим - надо ли блокировать кнопку "Отправить", ведь когда ошибка есть, т.е. длина строки больше нуля, кнопка должна быть заблокирована. Также признаком блокировки кнопки является отсутствие какого-либо текста в текстовом поле, что мы и проверяем при помощи TextBoxName.TextLength > 0

Последнее, что нам осталось сделать - дважды кликнуть на форме из представления конструктора формы, чтобы сгенерировался обработчик загрузки формы. В нём мы добавляем единственную строку, сразу регулируя доступность кнопки, как только форма загружается при старте программы:

        private void FrmErrorProviderSample_Load(object sender, EventArgs e) {
            EnableDisableSubmitButton();
        }

Наше приложение готово! Можете запустить и попробовать его в действии. При запуске программы видно, что элемент ErrorProvider успешно выполняет свою задачу и отображает иконку с ошибкой напротив текстового поля, а также убирает иконку, когда ввод в поле верный.

Напоследок отмечу два интересных и полезных свойства элемента ErrorProvider - это BlinkRate и BlinkStyle:

Они регулируют частоту мерцания иконки и тип мерцания. Если вы не хотите, чтобы иконка с ошибкой напротив текстового поля вообще мерцала - установите для BlinkStyle значение NeverBlink и посмотрите на результат, запустив приложение.

Вы также можете поменять свойство Icon для элемента ErrorProvider, указав путь к своей иконке для индикации ошибки.

На этом всё, спасибо за внимание. Пробуйте и делитесь отзывами в комментариях под статьёй. Архив с готовым примером доступен по ссылке.

Яндекс.Метрика