- Общие сведения о проверке вводимых пользователем данных (Windows Forms .NET) Overview of how to validate user input (Windows Forms .NET)
- Элемент управления MaskedTextBox MaskedTextBox Control
- Проверка на основе событий Event-driven validation
- Управляемые событиями элементы управления с привязкой к данным Event-driven validation data-bound controls
- Явная и неявная проверка Implicit and explicit validation
- Неявная проверка Implicit validation
- Явная проверка Explicit validation
- Поведение по умолчанию неявной проверки для элементов управления Default implicit validation behavior for controls
- Закрытие формы и переопределение проверки Closing the form and overriding Validation
Общие сведения о проверке вводимых пользователем данных (Windows Forms .NET) Overview of how to validate user input (Windows Forms .NET)
Когда пользователи вводят данные в приложение, может потребоваться проверить, являются ли данные допустимыми, прежде чем использовать их в приложении. When users enter data into your application, you may want to verify that the data is valid before your application uses it. Может потребоваться проверить, что определенные текстовые поля не были нулевой длины, что поле отформатировано как номер телефона или строка не содержит недопустимых символов. You may require that certain text fields not be zero-length, that a field formatted as a telephone number, or that a string doesn’t contain invalid characters. Windows Forms предоставляет несколько способов проверки вводимых данных в приложении. Windows Forms provides several ways for you to validate input in your application.
Документация для Руководства по рабочему столу по .NET 5 (и .NET Core) находится в разработке. The Desktop Guide documentation for .NET 5 (and .NET Core) is under construction.
Элемент управления MaskedTextBox MaskedTextBox Control
Если требуется, чтобы пользователи вводили данные в четко определенном формате, например номер телефона или артикул, это можно сделать быстро и с минимальным количеством кода с помощью элемента управления MaskedTextBox. If you need to require users to enter data in a well-defined format, such as a telephone number or a part number, you can accomplish this quickly and with minimal code by using the MaskedTextBox control. Маска — это строка, состоящая из символов языка маскирования, которые указывают, какие символы можно вводить в каждой заданной позиции в текстовом поле. A mask is a string made up of characters from a masking language that specifies which characters can be entered at any given position in the text box. Элемент управления отображает набор запросов пользователю. The control displays a set of prompts to the user. Если пользователь вводит неправильное значение, например, вводит букву, когда требуется цифра, элемент управления автоматически отклоняет введенные данные. If the user types an incorrect entry, for example, the user types a letter when a digit is required, the control will automatically reject the input.
Язык маскирования, используемый MaskedTextBox, является очень гибким. The masking language that is used by MaskedTextBox is flexible. Он позволяет указать обязательные символы, необязательные символы, литералы, такие как дефисы и скобки, символы валют и разделители дат. It allows you to specify required characters, optional characters, literal characters, such as hyphens and parentheses, currency characters, and date separators. Этот элемент управления также хорошо работает при привязке к источнику данных. The control also works well when bound to a data source. Событие Format в привязке данных можно использовать для переформатирования входящих данных в соответствии с маской, а событие Parse можно использовать для переформатирования исходящих данных в соответствии со спецификациями поля данных. The Format event on a data binding can be used to reformat incoming data to comply with the mask, and the Parse event can be used to reformat outgoing data to comply with the specifications of the data field.
Проверка на основе событий Event-driven validation
Если требуется полностью программный контроль над проверкой или нужно выполнять сложные проверки, следует использовать события проверки, встроенные в большинство элементов управления Windows Forms. If you want full programmatic control over validation, or need complex validation checks, you should use the validation events that are built into most Windows Forms controls. У каждого элемента управления, принимающего пользовательский ввод в свободной форме, есть событие Validating, которое возникает каждый раз, когда элементу управления требуется проверка данных. Each control that accepts free-form user input has a Validating event that will occur whenever the control requires data validation. В методе обработки событий Validating можно проверить ввод пользователя несколькими способами. In the Validating event-handling method, you can validate user input in several ways. Например, если имеется текстовое поле, которое должно содержать почтовый индекс, можно выполнить проверку следующими способами. For example, if you have a text box that must contain a postal code, you can do the validation in the following ways:
Если почтовый индекс должен принадлежать к определенной группе почтовых индексов, можно выполнить сравнение строк на входе, чтобы проверить введенные пользователем данные. If the postal code must belong to a specific group of zip codes, you can do a string comparison on the input to validate the data entered by the user. Например, если почтовый индекс должен быть из набора <10001, 10002, 10003>, можно использовать сравнение строк для проверки данных. For example, if the postal code must be in the set <10001, 10002, 10003>, then you can use a string comparison to validate the data.
Если почтовый индекс должен быть указан в определенной форме, можно использовать регулярные выражения для проверки данных, вводимых пользователем. If the postal code must be in a specific form, you can use regular expressions to validate the data entered by the user. Например, чтобы проверить формат ##### или #####-#### , можно использовать регулярное выражение ^(\d<5>)(-\d<4>)?$ . For example, to validate the form ##### or #####-#### , you can use the regular expression ^(\d<5>)(-\d<4>)?$ . Чтобы проверить формат A#A #A# , можно использовать регулярное выражение [A-Z]\d[A-Z] \d[A-Z]\d . To validate the form A#A #A# , you can use the regular expression [A-Z]\d[A-Z] \d[A-Z]\d . Дополнительные сведения о регулярных выражениях см. в разделах Регулярные выражения .NET и Примеры регулярных выражений. For more information about regular expressions, see .NET Regular Expressions and Regular Expression Examples.
Если почтовый индекс должен быть допустимым почтовым индексом США, можно вызвать веб-службу почтовых индексов для проверки данных, введенных пользователем. If the postal code must be a valid United States Zip code, you could call a Zip code Web service to validate the data entered by the user.
Событие Validating предоставляется объектом типа CancelEventArgs. The Validating event is supplied an object of type CancelEventArgs. Если вы определили, что данные элемента управления недопустимы, отмените событие Validating, задав свойству Cancel этого объекта значение true . If you determine that the control’s data isn’t valid, cancel the Validating event by setting this object’s Cancel property to true . Если свойство Cancel не задано, Windows Forms будет считать, что проверка для этого элемента управления прошла удачно, и порождает событие Validated. If you don’t set the Cancel property, Windows Forms will assume that validation succeeded for that control and raise the Validated event.
Пример кода, который проверяет адрес электронной почты в TextBox, см. в справочнике по событию Validating. For a code example that validates an email address in a TextBox, see the Validating event reference.
Управляемые событиями элементы управления с привязкой к данным Event-driven validation data-bound controls
Эта проверка полезна, если элементы управления привязаны к источнику данных, например к таблице базы данных. Validation is useful when you have bound your controls to a data source, such as a database table. С помощью проверки можно убедиться, что данные элемента управления соответствуют формату, требуемому для источника данных, и что они не содержат специальные символы, такие как кавычки и обратная косая черта, которые могут быть небезопасными. By using validation, you can make sure that your control’s data satisfies the format required by the data source, and that it doesn’t contain any special characters such as quotation marks and back slashes that might be unsafe.
При использовании привязки данные в элементе управления синхронизируются с источником данных во время выполнения события Validating. When you use data binding, the data in your control is synchronized with the data source during execution of the Validating event. Если отменить событие Validating, данные не будут синхронизированы с источником данных. If you cancel the Validating event, the data won’t be synchronized with the data source.
Если после события Validating выполняется пользовательская проверка, это не повлияет на привязку данных. If you have custom validation that takes place after the Validating event, it won’t affect the data binding. Например, если в событии Validated имеется код, который пытается отменить привязку данных, привязка данных все равно будет выполняться. For example, if you have code in a Validated event that attempts to cancel the data binding, the data binding will still occur. В этом случае для выполнения проверки в событии Validated измените значения свойства элемента управления Binding.DataSourceUpdateMode с DataSourceUpdateMode.OnValidation на DataSourceUpdateMode.Never и добавьте your-control.DataBindings[«field-name»].WriteValue() в код проверки. In this case, to perform validation in the Validated event, change the control’s Binding.DataSourceUpdateMode property from DataSourceUpdateMode.OnValidation to DataSourceUpdateMode.Never, and add your-control.DataBindings[«field-name»].WriteValue() to your validation code.
Явная и неявная проверка Implicit and explicit validation
Итак, когда выполняется проверка данных элемента управления? So when does a control’s data get validated? Это решает разработчик. This is up to you, the developer. В зависимости от потребностей приложения можно использовать явную или неявную проверку. You can use either implicit or explicit validation, depending on the needs of your application.
Неявная проверка Implicit validation
При неявной проверке данные проверяются по мере их ввода пользователем. The implicit validation approach validates data as the user enters it. Данные проверяются путем считывания клавиш при их нажатии или, что более часто, когда пользователь снимает фокус с элемента управления. Validate the data by reading the keys as they’re pressed, or more commonly whenever the user takes the input focus away from the control. Этот подход удобен, если вы хотите предоставлять пользователям немедленную обратную связь о данных прямо во время их работы. This approach is useful when you want to give the user immediate feedback about the data as they’re working.
Если вы хотите использовать неявную проверку для элемента управления, необходимо задать его свойству AutoValidate значение EnablePreventFocusChange или EnableAllowFocusChange. If you want to use implicit validation for a control, you must set that control’s AutoValidate property to EnablePreventFocusChange or EnableAllowFocusChange. При отмене события Validating поведение элемента управления будет определяться значением, назначенным свойству AutoValidate. If you cancel the Validating event, the behavior of the control will be determined by what value you assigned to AutoValidate. Если вы установили значение EnablePreventFocusChange, отмена события приведет к возникновению события Validated. If you assigned EnablePreventFocusChange, canceling the event will cause the Validated event not to occur. Фокус поля ввода будет оставаться на текущем элементе управления до тех пор, пока пользователь не изменит данные на допустимый формат. Input focus will remain on the current control until the user changes the data to a valid format. Если вы установили значение EnableAllowFocusChange, событие Validated не произойдет при отмене события, но фокус по-прежнему будет переходить к следующему элементу управления. If you assigned EnableAllowFocusChange, the Validated event won’t occur when you cancel the event, but focus will still change to the next control.
Присвоение значения Disable свойству AutoValidate полностью отключает неявную проверку. Assigning Disable to the AutoValidate property prevents implicit validation altogether. Тогда для проверки элемента управления необходимо использовать явную проверку. To validate your controls, you’ll have to use explicit validation.
Явная проверка Explicit validation
При явной проверке данные проверяются за один раз. The explicit validation approach validates data at one time. Вы можете проверить данные в ответ на действие пользователя, например нажатие кнопки Сохранить или ссылки Далее. You can validate the data in response to a user action, such as clicking a Save button or a Next link. При возникновении действия пользователя можно активировать явную проверку одним из следующих способов: When the user action occurs, you can trigger explicit validation in one of the following ways:
- вызов метода Validate, чтобы проверить последний элемент управления, который потерял фокус; Call Validate to validate the last control to have lost focus.
- вызов метода ValidateChildren, чтобы проверить все дочерние элементы управления в форме или контейнере; Call ValidateChildren to validate all child controls in a form or container control.
- вызов пользовательского метода для проверки данных в элементах управления вручную. Call a custom method to validate the data in the controls manually.
Поведение по умолчанию неявной проверки для элементов управления Default implicit validation behavior for controls
Различные элементы управления Windows Forms имеют разные значения по умолчанию свойства AutoValidate. Different Windows Forms controls have different defaults for their AutoValidate property. В следующей таблице показаны наиболее распространенные элементы управления и их значения по умолчанию. The following table shows the most common controls and their defaults.
Control Control | Поведение проверки по умолчанию Default Validation Behavior |
---|---|
ContainerControl | Inherit |
Form | EnableAllowFocusChange |
PropertyGrid | Свойство не предоставлено в Visual Studio Property not exposed in Visual Studio |
ToolStripContainer | Свойство не предоставлено в Visual Studio Property not exposed in Visual Studio |
SplitContainer | Inherit |
UserControl | EnableAllowFocusChange |
Закрытие формы и переопределение проверки Closing the form and overriding Validation
Когда элемент управления сохраняет фокус, поскольку содержащиеся в нем данные являются недопустимыми, невозможно закрыть родительскую форму одним из обычных способов: When a control maintains focus because the data it contains is invalid, it’s impossible to close the parent form in one of the usual ways:
- нажатием кнопки Закрыть; By clicking the Close button.
- выбором пункта меню Система >Закрыть; By selecting the System >Close menu.
- вызовом метода Close программным способом. By calling the Close method programmatically.
Однако в некоторых случаях может потребоваться разрешить пользователю закрывать форму независимо от того, являются ли значения в элементах управления допустимыми. However, in some cases, you might want to let the user close the form regardless of whether the values in the controls are valid. Можно переопределить проверку и закрыть форму, которая все еще содержит недопустимые данные, создав обработчик для события FormClosing формы. You can override validation and close a form that still contains invalid data by creating a handler for the form’s FormClosing event. В событии задайте для свойства Cancel значение false . In the event, set the Cancel property to false . Это приведет к принудительному закрытию формы. This forces the form to close. Дополнительные сведения и пример см. в разделе Form.FormClosing. For more information and an example, see Form.FormClosing.
Если принудительно закрыть форму таким образом, все данные в элементах управления формы, которые еще не были сохранены, теряются. If you force the form to close in this manner, any data in the form’s controls that has not already been saved is lost. Кроме того, модальные формы не проверяют содержимое элементов управления при их закрытии. In addition, modal forms don’t validate the contents of controls when they’re closed. Вы по-прежнему можете использовать проверку элемента управления для блокировки фокуса на элементе управления, но вам не нужно беспокоиться о поведении, связанном с закрытием формы. You can still use control validation to lock focus to a control, but you don’t have to be concerned about the behavior associated with closing the form.