Validación de los datos proporcionados por el usuario en formularios Windows FormsUser Input Validation in Windows Forms

Cuando los usuarios escriben datos en la aplicación, puede que desee comprobar que los datos son válidos antes de que la aplicación los use.When users enter data into your application, you may want to verify that the data is valid before your application uses it. Es posible que necesite que determinados campos de texto no tengan una longitud cero, que un campo tenga formato de número de teléfono u otro tipo de datos con formato correcto, o que una cadena no contenga ningún carácter no seguro que pueda usarse para poner en peligro la seguridad de una base de datos.You may require that certain text fields not be zero-length, that a field be formatted as a telephone number or other type of well-formed data, or that a string not contain any unsafe characters that could be used to compromise the security of a database. Windows Forms proporciona varias maneras de validar la entrada en la aplicación.Windows Forms provides several ways for you to validate input in your application.

Validación con el control MaskedTextBoxValidation with the MaskedTextBox Control

Si necesita que los usuarios escriban datos en un formato bien definido, como un número de teléfono o un número de pieza, puede hacerlo rápidamente y con un código mínimo mediante el control de 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. Una máscara es una cadena formada por caracteres de un lenguaje de enmascaramiento que especifica los caracteres que se pueden escribir en cualquier posición determinada en el cuadro de texto.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. El control muestra un conjunto de mensajes para el usuario.The control displays a set of prompts to the user. Si el usuario escribe una entrada incorrecta, por ejemplo, el usuario escribe una letra cuando se requiere un dígito, el control rechazará automáticamente la entrada.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.

El lenguaje de enmascaramiento que usa MaskedTextBox es muy flexible.The masking language that is used by MaskedTextBox is very flexible. Permite especificar caracteres necesarios, caracteres opcionales, caracteres literales, como guiones y paréntesis, caracteres de divisa y separadores de fecha.It allows you to specify required characters, optional characters, literal characters, such as hyphens and parentheses, currency characters, and date separators. El control también funciona bien cuando se enlaza a un origen de datos.The control also works well when bound to a data source. El evento Format de un enlace de datos se puede usar para volver a dar formato a los datos entrantes para que cumplan la máscara y el evento Parse se puede usar para volver a dar formato a los datos salientes para cumplir las especificaciones del campo de datos.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.

Para obtener más información, vea control MaskedTextBox.For more information, see MaskedTextBox Control.

Validación controlada por eventosEvent-Driven Validation

Si desea tener un control completo mediante programación sobre la validación o necesita realizar comprobaciones de validación complejas, debe utilizar los eventos de validación integrados en la mayoría de los controles de Windows Forms.If you want full programmatic control over validation, or need to perform complex validation checks, you should use the validation events built into most Windows Forms controls. Cada control que acepta datos proporcionados por el usuario de forma libre tiene un evento Validating que se producirá cada vez que el control requiera la validación de datos.Each control that accepts free-form user input has a Validating event that will occur whenever the control requires data validation. En el método de control de eventos Validating, puede validar los datos proporcionados por el usuario de varias maneras.In the Validating event-handling method, you can validate user input in several ways. Por ejemplo, si tiene un cuadro de texto que debe contener un código postal, puede realizar la validación de las siguientes maneras:For example, if you have a text box that must contain a postal code, you can perform the validation in the following ways:

  • Si el código postal debe pertenecer a un grupo específico de códigos postales, puede realizar una comparación de cadenas en la entrada para validar los datos introducidos por el usuario.If the postal code must belong to a specific group of zip codes, you can perform a string comparison on the input to validate the data entered by the user. Por ejemplo, si el código postal debe estar en el conjunto {10001, 10002, 10003}, puede usar una comparación de cadenas para validar los datos.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.

  • Si el código postal debe estar en un formato específico, puede usar expresiones regulares para validar los datos especificados por el usuario.If the postal code must be in a specific form you can use regular expressions to validate the data entered by the user. Por ejemplo, para validar el formulario ##### o #####-####, puede usar la expresión regular ^(\d{5})(-\d{4})?$.For example, to validate the form ##### or #####-####, you can use the regular expression ^(\d{5})(-\d{4})?$. Para validar el formulario A#A #A#, puede usar el [A-Z]\d[A-Z] \d[A-Z]\dde la expresión regular.To validate the form A#A #A#, you can use the regular expression [A-Z]\d[A-Z] \d[A-Z]\d. Para obtener más información sobre las expresiones regulares, vea .NET Framework expresiones regulares y ejemplos de expresiones regulares.For more information about regular expressions, see .NET Framework Regular Expressions and Regular Expression Examples.

  • Si el código postal debe ser un código postal de Estados Unidos válido, puede llamar a un servicio Web de código postal para validar los datos introducidos por el usuario.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.

El evento Validating se suministra a un objeto de tipo CancelEventArgs.The Validating event is supplied an object of type CancelEventArgs. Si determina que los datos del control no son válidos, puede cancelar el evento Validating estableciendo la propiedad Cancel de este objeto en true.If you determine that the control's data is not valid, you can cancel the Validating event by setting this object's Cancel property to true. Si no establece la propiedad Cancel, Windows Forms asumirá que la validación se realizó correctamente para ese control y generará el evento Validated.If you do not set the Cancel property, Windows Forms will assume that validation succeeded for that control, and raise the Validated event.

Para obtener un ejemplo de código que valida una dirección de correo electrónico en un TextBox, vea Validating.For a code example that validates an email address in a TextBox, see Validating.

Enlace de datos y validación controlada por eventosData Binding and Event-Driven Validation

La validación es muy útil cuando se enlazan los controles a un origen de datos, como una tabla de base de datos.Validation is very useful when you have bound your controls to a data source, such as a database table. Mediante el uso de la validación, puede asegurarse de que los datos del control satisfacen el formato requerido por el origen de datos y que no contienen ningún carácter especial como comillas y barras diagonales inversas que podrían no ser seguras.By using validation, you can make sure that your control's data satisfies the format required by the data source, and that it does not contain any special characters such as quotation marks and back slashes that might be unsafe.

Cuando se usa el enlace de datos, los datos del control se sincronizan con el origen de datos durante la ejecución del evento Validating.When you use data binding, the data in your control is synchronized with the data source during execution of the Validating event. Si cancela el evento Validating, los datos no se sincronizarán con el origen de datos.If you cancel the Validating event, the data will not be synchronized with the data source.

Importante

Si tiene validación personalizada que tiene lugar después del evento Validating, no afectará al enlace de datos.If you have custom validation that takes place after the Validating event, it will not affect the data binding. Por ejemplo, si tiene código en un evento de Validated que intenta cancelar el enlace de datos, se seguirá produciendo el enlace de datos.For example, if you have code in a Validated event that attempts to cancel the data binding, the data binding will still occur. En este caso, para realizar la validación en el evento Validated, cambie la propiedad del modo de actualización del origen de datos del control (en (DataBindings) \ (avanzado) ) de la validación a nuncay agregue.DataBindings["de control <sucampo > a su código de validación.In this case, to perform validation in the Validated event, change the control's Data Source Update Mode property (under (Databindings)\ (Advanced)) from OnValidation to Never, and add Control.DataBindings["<YOURFIELD>"].WriteValue() to your validation code.

Validación implícita y explícitaImplicit and Explicit Validation

¿Cuándo se validan los datos de un control?So when does a control's data get validated? Este es el desarrollador.This is up to you, the developer. Puede usar la validación implícita o explícita, en función de las necesidades de la aplicación.You can use either implicit or explicit validation, depending on the needs of your application.

Validación implícitaImplicit Validation

El método de validación implícita valida los datos a medida que el usuario los escribe.The implicit validation approach validates data as the user enters it. Puede validar los datos a medida que los datos se escriben en un control leyendo las teclas a medida que se presionan, o con mayor frecuencia cada vez que el usuario toma el foco de entrada de un control y se desplaza a la siguiente.You can validate the data as the data is entered in a control by reading the keys as they are pressed, or more commonly whenever the user takes the input focus away from one control and moves to the next. Este enfoque es útil cuando desea proporcionar al usuario comentarios inmediatos sobre los datos mientras están trabajando.This approach is useful when you want to give the user immediate feedback about the data as they are working.

Si desea utilizar la validación implícita para un control, debe establecer la propiedad AutoValidate de ese control en EnablePreventFocusChange o EnableAllowFocusChange.If you want to use implicit validation for a control, you must set that control's AutoValidate property to EnablePreventFocusChange or EnableAllowFocusChange. Si cancela el evento Validating, el comportamiento del control estará determinado por el valor asignado a AutoValidate.If you cancel the Validating event, the behavior of the control will be determined by what value that you assigned to AutoValidate. Si ha asignado EnablePreventFocusChange, al cancelar el evento se producirá que no se produzca el evento de Validated.If you assigned EnablePreventFocusChange, canceling the event will cause the Validated event not to occur. El foco de entrada permanecerá en el control actual hasta que el usuario cambie los datos a una entrada válida.Input focus will remain on the current control until the user changes the data to a valid input. Si ha asignado EnableAllowFocusChange, el evento de Validated no se producirá al cancelar el evento, pero el foco seguirá cambiado al control siguiente.If you assigned EnableAllowFocusChange, the Validated event will not occur when you cancel the event, but focus will still change to the next control.

La asignación de Disable a la propiedad AutoValidate evita totalmente la validación implícita.Assigning Disable to the AutoValidate property prevents implicit validation altogether. Para validar los controles, tendrá que usar la validación explícita.To validate your controls, you will have to use explicit validation.

Validación explícitaExplicit Validation

El enfoque de validación explícita valida los datos al mismo tiempo.The explicit validation approach validates data at one time. Puede validar los datos en respuesta a una acción del usuario, como hacer clic en un botón Guardar o en un vínculo siguiente.You can validate the data in response to a user action, such as clicking a Save button or a Next link. Cuando se produce la acción del usuario, puede desencadenar la validación explícita de una de las siguientes maneras:When the user action occurs, you can trigger explicit validation in one of the following ways:

  • Llame a Validate para validar que el último control ha perdido el foco.Call Validate to validate the last control to have lost focus.

  • Llame a ValidateChildren para validar todos los controles secundarios de un formulario o control contenedor.Call ValidateChildren to validate all child controls in a form or container control.

  • Llame a un método personalizado para validar manualmente los datos de los controles.Call a custom method to validate the data in the controls manually.

Comportamiento de validación implícita predeterminada para controles de Windows FormsDefault Implicit Validation Behavior for Windows Forms Controls

Los distintos controles Windows Forms tienen valores predeterminados diferentes para su propiedad AutoValidate.Different Windows Forms controls have different defaults for their AutoValidate property. En la tabla siguiente se muestran los controles más comunes y sus valores predeterminados.The following table shows the most common controls and their defaults.

ControlControl Comportamiento de validación predeterminadoDefault Validation Behavior
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Propiedad no expuesta en Visual StudioProperty not exposed in Visual Studio
ToolStripContainer Propiedad no expuesta en Visual StudioProperty not exposed in Visual Studio
SplitContainer Inherit
UserControl EnableAllowFocusChange

Cerrar el formulario e invalidar la validaciónClosing the Form and Overriding Validation

Cuando un control mantiene el foco porque los datos que contiene no son válidos, es imposible cerrar el formulario principal de una de las maneras habituales:When a control maintains focus because the data it contains is invalid, it is impossible to close the parent form in one of the usual ways:

  • Haciendo clic en el botón cerrar .By clicking the Close button.

  • Seleccionando cerrar en el menú sistema .By selecting Close in the System menu.

  • Llamando al método Close mediante programación.By calling the Close method programmatically.

Sin embargo, en algunos casos, es posible que desee permitir que el usuario cierre el formulario independientemente de si los valores de los controles son válidos.However, in some cases, you might want to let the user close the form regardless of whether the values in the controls are valid. Puede invalidar la validación y cerrar un formulario que todavía contiene datos no válidos creando un controlador para el evento FormClosing del formulario.You can override validation and close a form that still contains invalid data by creating a handler for the form's FormClosing event. En el evento, establezca la propiedad Cancel en false.In the event, set the Cancel property to false. Esto fuerza el cierre del formulario.This forces the form to close. Para obtener más información y un ejemplo, vea Form.FormClosing.For more information and an example, see Form.FormClosing.

Nota

Si fuerza al formulario a cerrarse de esta manera, se perderán los datos de los controles del formulario que no se hayan guardado todavía.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. Además, los formularios modales no validan el contenido de los controles cuando están cerrados.In addition, modal forms do not validate the contents of controls when they are closed. Todavía puede usar la validación de controles para bloquear el foco a un control, pero no tiene que preocuparse del comportamiento asociado al cierre del formulario.You can still use control validation to lock focus to a control, but you do not have to be concerned about the behavior associated with closing the form.

Vea tambiénSee also