Поделиться через


Проверка ввода пользователей в Windows Forms

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

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

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

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

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

проверка Event-Driven

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

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

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

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

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

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

Привязка данных и валидация Event-Driven

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

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

Важный

Если после события Validating выполняется настраиваемая проверка, она не повлияет на привязку данных. Например, если у вас есть код в событии Validated, который пытается отменить привязку данных, привязка данных всё равно будет выполняться. В этом случае, чтобы выполнить проверку в событии Validated, измените свойство режима обновления источника данных элемента управления (в\(Дополнительные)) с OnValidation на никогдаи добавьте 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

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

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

  • Нажав кнопку Закрыть.

  • Выбрав Закрыть в меню System.

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

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

Заметка

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

См. также