Проверка введенных пользователем данных в Windows Forms

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

Проверка с помощью элемента управления MaskedTextBox

Если требуется, чтобы пользователи вводили данные в четко определенном формате, например номер телефона или артикул, это можно сделать быстро и с минимальным количеством кода с помощью элемента управления MaskedTextBox. Маска — это строка, состоящая из символов языка маскирования, которые указывают, какие символы можно вводить в каждой заданной позиции в текстовом поле. Элемент управления отображает набор запросов пользователю. Если пользователь вводит неправильное значение, например, вводит букву, когда требуется цифра, элемент управления автоматически отклоняет введенные данные.

Язык маскирования, используемый MaskedTextBox, является очень гибким. Он позволяет указать обязательные символы, необязательные символы, литералы, такие как дефисы и скобки, символы валют и разделители дат. Этот элемент управления также хорошо работает при привязке к источнику данных. Событие Format в привязке данных можно использовать для переформатирования входящих данных в соответствии с маской, а событие Parse можно использовать для переформатирования исходящих данных в соответствии со спецификациями поля данных.

Дополнительные сведения см. в разделе Элемент управления MaskedTextBox.

Проверка на основе событий

Если требуется полностью программный контроль над проверкой или нужно выполнять сложные проверки, следует использовать события проверки, встроенные в большинство элементов управления Windows Forms. У каждого элемента управления, принимающего пользовательский ввод в свободной форме, есть событие Validating, которое возникает каждый раз, когда элементу управления требуется проверка данных. В методе обработки событий Validating можно проверить ввод пользователя несколькими способами. Например, если имеется текстовое поле, которое должно содержать почтовый индекс, можно выполнить проверку следующими способами:

  • Если почтовый индекс должен принадлежать к определенной группе почтовых индексов, можно выполнить сравнение строк на входе, чтобы проверить введенные пользователем данные. Например, если почтовый индекс должен быть из набора {10001, 10002, 10003}, можно использовать сравнение строк для проверки данных.

  • Если почтовый индекс должен быть указан в определенной форме, можно использовать регулярные выражения для проверки данных, вводимых пользователем. Например, чтобы проверить формат ##### или #####-####, можно использовать регулярное выражение ^(\d{5})(-\d{4})?$. Чтобы проверить формат A#A #A#, можно использовать регулярное выражение [A-Z]\d[A-Z] \d[A-Z]\d. Дополнительные сведения о регулярных выражениях см. в разделах Регулярные выражения .NET Framework и Примеры регулярных выражений.

  • Если почтовый индекс должен быть допустимым почтовым индексом США, можно вызвать веб-службу почтовых индексов для проверки данных, введенных пользователем.

Событие Validating предоставляется объектом типа CancelEventArgs. Если вы определили, что данные элемента управления недопустимы, событие Validating можно отменить, задав свойству Cancel этого объекта значение true. Если свойство Cancel не задано, Windows Forms будет считать, что проверка для этого элемента управления прошла удачно, и порождает событие Validated.

Пример кода, который проверяет адрес электронной почты в TextBox, см. в Validating.

Привязка данных и проверка на основе событий

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

При использовании привязки данные в элементе управления синхронизируются с источником данных во время выполнения события Validating. Если отменить событие Validating, данные не будут синхронизированы с источником данных.

Важно!

Если после события Validating выполняется пользовательская проверка, это не повлияет на привязку данных. Например, если в событии Validated имеется код, который пытается отменить привязку данных, привязка данных все равно будет выполняться. В этом случае, чтобы выполнить проверку в событии Validated, нужно изменить у элемента управления свойство Режим обновления источника данных (в разделе (Привязки данных)\(Расширенный)) со значения OnValidation на Never и добавить Control.DataBindings["<YOURFIELD>"].WriteValue() в код проверки.

Явная и неявная проверка

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

Неявная проверка

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

Если вы хотите использовать неявную проверку для элемента управления, необходимо задать его свойству AutoValidate значение EnablePreventFocusChange или EnableAllowFocusChange. При отмене события Validating поведение элемента управления будет определяться значением, назначенным свойству AutoValidate. Если вы установили значение EnablePreventFocusChange, отмена события приведет к возникновению события Validated. Фокус поля ввода будет оставаться на текущем элементе управления до тех пор, пока пользователь не изменит данные в соответствии с допустимыми входными данными. Если вы установили значение EnableAllowFocusChange, событие Validated не произойдет при отмене события, но фокус по-прежнему будет переходить к следующему элементу управления.

Присвоение значения Disable свойству AutoValidate полностью отключает неявную проверку. Тогда для проверки элемента управления необходимо использовать явную проверку.

Явная проверка

При явной проверке данные проверяются за один раз. Вы можете проверить данные в ответ на действие пользователя, например нажатие кнопки Сохранить или ссылки Далее. При возникновении действия пользователя можно активировать явную проверку одним из следующих способов:

  • вызов метода Validate, чтобы проверить последний элемент управления, который потерял фокус;

  • вызов метода ValidateChildren, чтобы проверить все дочерние элементы управления в форме или контейнере;

  • вызов пользовательского метода для проверки данных в элементах управления вручную.

Поведение по умолчанию неявной проверки для элементов управления Windows Forms

Различные элементы управления Windows Forms имеют разные значения по умолчанию свойства AutoValidate. В следующей таблице показаны наиболее распространенные элементы управления и их значения по умолчанию.

Элемент управления Поведение проверки по умолчанию
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Свойство не предоставлено в Visual Studio
ToolStripContainer Свойство не предоставлено в Visual Studio
SplitContainer Inherit
UserControl EnableAllowFocusChange

Закрытие формы и переопределение проверки

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

  • нажатием кнопки Закрыть;

  • нажатием кнопки Закрыть в меню Система.

  • вызовом метода Close программным способом.

Однако в некоторых случаях может потребоваться разрешить пользователю закрывать форму независимо от того, являются ли значения в элементах управления допустимыми. Можно переопределить проверку и закрыть форму, которая все еще содержит недопустимые данные, создав обработчик для события FormClosing формы. В событии задайте для свойства Cancel значение false. Это приведет к принудительному закрытию формы. Дополнительные сведения и пример см. в разделе Form.FormClosing.

Примечание.

Если принудительно закрыть форму таким образом, все данные в элементах управления формы, которые еще не были сохранены, теряются. Кроме того, модальные формы не проверяют содержимое элементов управления при их закрытии. Вы по-прежнему можете использовать проверку элемента управления для блокировки фокуса на элементе управления, но вам не нужно беспокоиться о поведении, связанном с закрытием формы.

См. также