Проверка введенных пользователем данных в Windows Forms
При вводе данных пользователем, возможно, требуется проверить их правильность перед тем, как приложение использует их. Возможно, необходимо, чтобы некоторые текстовые поля не были пустыми, были отформатированы как номер телефона или другой тип данных или чтобы строки не содержали небезопасных знаков, которые могут быть использованы для нарушения безопасности базы данных. В Windows Forms предусмотрено несколько способов проверки входных данных приложения.
Проверка с помощью элемента управления MaskedTextBox
При необходимости потребовать от пользователя вводить данные в четко определенном формате, таком как номер телефона или номер изделия, это можно сделать быстро и с использованием минимума кода с помощью элемента управления MaskedTextBox. Маска — это строка, которая состоит из знаков языка масок, определяющего, какие знаки могут вводиться в любом заданном положении в текстовом поле. Элемент управления отображает набор приглашений пользователю. Если пользователь вводит неправильную запись, например вводит букву, когда требуется цифра, элемент управления автоматически отклонит вводимые данные.
Язык масок, используемый элементом управления MaskedTextBox, является весьма гибким. Он позволяет указать обязательные знаки, необязательные знаки, знаки литералов, такие как дефисы и круглые скобки, знаки валют и разделители даты. Элемент управления также работает при привязке к источнику данных. Событие Format привязки данных может использоваться для переформатирования входящих данных в соответствии с маской, а событие Parse — для переформатирования исходящих данных в соответствии со спецификациями поля данных.
Дополнительные сведения см. в разделе Элемент управления MaskedTextBox (Windows Forms).
Проверка на основе событий
Если требуется полный программный контроль над проверкой или необходимо выполнить сложную проверку, следует использовать события проверки, встроенные в большинство элементов управления 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 измените свойство DataSourceUpdateMode элемента управления (в (DataBindings)\(Advanced)) с OnValidation на Never и добавьте функцию элемент_управления.DataBindings["<ВАШЕ_ПОЛЕ>"].WriteValue() в код проверки.
Явная и неявная проверка
Когда проверяются данные элемента управления? Это зависит от разработчика. Можно использовать явную или неявную проверку в зависимости от требований приложения.
Неявная проверка
При неявной проверке данные проверяются по мере того, как пользователь вводит их. Можно проверять данные, вводимые пользователем в элемент управления, путем чтения клавиш по мере того, как они нажимаются, или, что более распространено, при переводе фокуса с одного элемента управления к следующему. Этот подход полезен при необходимости предоставить пользователю немедленный отклик о неправильных данных во время работы.
Если требуется использовать неявную проверку для элемента управления, следует установить для свойства AutoValidate этого элемента управления значение true. При отмене события Validating поведение элемента управления будет определяться значением свойства AutoValidate. Если установлено значение EnablePreventFocusChange, отмена события приведет к тому, что событие Validated не возникнет. Фокус ввода останется на текущем элементе управления до тех пор, пока пользователь не введет допустимые данные. Если установлено значение EnableAllowFocusChange, событие Validated не возникнет при отмене события, но фокус будет по-прежнему переходить к следующему элементу управления.
При установке значения Disable свойству AutoValidate неявная проверка будет полностью запрещена. Чтобы проверить элементы управления, необходимо использовать явную проверку.
Явная проверка
При явной проверке данные проверяются за один раз. Можно проверить данные в ответ на такие действия пользователя, как нажатие кнопки "Сохранить" или ссылки "Далее". Вызвать явную проверку в ответ на действие пользователя можно одним из перечисленных ниже способов.
Вызовите метод Validate для проверки последнего элемента управления, с которого был перемещен фокус.
Вызовите метод ValidateChildren для проверки всех дочерних элементов управления в форме или контейнере.
Вызовите пользовательский метод для проверки данных в элементах управления вручную.
Поведение неявной проверки по умолчанию для элементов управления Windows Forms
Различные элементы управления Windows Forms имеют различные значения по умолчанию для свойства AutoValidate. В следующей таблице приведены наиболее распространенные элементы управления и их значения по умолчанию.
Элемент управления |
Поведение проверки по умолчанию |
---|---|
Свойство не предоставляется в Visual Studio |
|
Свойство не предоставляется в Visual Studio |
|
Закрытие формы и обход проверки
Если элемент управления сохраняет фокус, поскольку содержит недопустимые данные, невозможно закрыть родительскую форму одним из обычных способов, перечисленных ниже.
Нажав кнопку Закрыть.
Выбрав Закрыть в меню Система.
Вызвав метод Close программными средствами.
Тем не менее, в некоторых случаях может потребоваться разрешить пользователю закрыть форму вне зависимости от того, ввел ли он в элементы управления допустимые значения. Можно обойти проверку и закрыть форму, которая по-прежнему содержит недопустимые данные, путем создания обработчика события Closing формы. В этом событии задайте свойству Cancel значение false. Это приведет к принудительному закрытию формы. Дополнительные сведения и примеры см. в разделе Form.Closing.
Примечание
Если закрытие формы осуществляется данным способом, все несохраненные сведения в элементах управления будут потеряны.Кроме того, модальные формы не проверяют содержимое элементов управления при закрытии.Можно по-прежнему использовать проверку элементов управления для того, чтобы блокировать фокус на элементе управления, но нет необходимости задумываться о поведении формы при закрытии.
См. также
Ссылки
System.ComponentModel.CancelEventArgs