Validación de los datos proporcionados por el usuario en formularios Windows Forms

Cuando los usuarios escriben datos en la aplicación, es posible que quiera comprobar que sean válidos antes de que la aplicación los use. Es posible que necesite que determinados campos de texto no sean de longitud cero, que un campo tenga formato de número de teléfono u otro tipo de datos bien formados, 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. Windows Forms proporciona varias maneras de validar la entrada en la aplicación.

Validación con el control MaskedTextBox

Si necesita que los usuarios escriban datos en un formato bien definido, como un número de teléfono o un número de repuesto, puede hacerlo rápidamente y con un código mínimo mediante el control MaskedTextBox. 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 del cuadro de texto. El control muestra un conjunto de mensajes para el usuario. Si el usuario escribe una entrada incorrecta, por ejemplo, una letra cuando se requiere un dígito, el control rechazará la entrada de forma automática.

El lenguaje de enmascaramiento que usa MaskedTextBox es muy flexible. Permite especificar caracteres necesarios, opcionales, literales (guiones y paréntesis), caracteres de divisa y separadores de fecha. El control también funciona bien cuando se enlaza a un origen de datos. El evento Format de un enlace de datos se puede usar para volver a dar formato a los datos entrantes para que se ajusten a la máscara y el evento Parse con los datos salientes para que cumplan las especificaciones del campo de datos.

Para obtener más información, consulte Control MaskedTextBox.

Validación controlada por eventos

Si quiere un control completo de la validación mediante programación o necesita comprobaciones de validación complejas, debe usar los eventos de validación que están integrados en la mayoría de los controles de Windows Forms. Cada control que acepta entrada de usuario en formato libre tiene un evento Validating que se producirá cada vez que el control necesite la validación de datos. En el método de control de eventos Validating, puede validar la entrada de usuario de varias maneras. Por ejemplo, si tiene un cuadro de texto que debe contener un código postal, puede realizar la validación de las siguientes maneras:

  • 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. 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.

  • Si el código postal debe estar en un formato específico, puede usar expresiones regulares para validar los datos introducidos por el usuario. Por ejemplo, para validar el formulario ##### o #####-####, puede usar la expresión regular ^(\d{5})(-\d{4})?$. Para validar el formulario A#A #A#, puede usar la expresión regular [A-Z]\d[A-Z] \d[A-Z]\d. Para obtener más información sobre las expresiones regulares, consulte Expresiones regulares de .NET Framework y Ejemplos de expresiones regulares.

  • 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 escritos por el usuario.

Al evento Validating se le suministra un objeto de tipo CancelEventArgs. Si determina que los datos del control no son válidos, puede cancelar el evento Validating al establecer la propiedad Cancel de este objeto como true. Si no establece la propiedad Cancel, Windows Forms asumirá que la validación se ha realizado correctamente para ese control y generará el evento Validated.

Para obtener un ejemplo de código que valida una dirección de correo electrónico en una instancia de TextBox, consulte Validating.

Enlace de datos y validación controlada por eventos

La validación es muy útil cuando los controles se han enlazado a un origen de datos, como una tabla de base de datos. Mediante la validación, puede asegurarse de que los datos del control satisfacen el formato que necesita el origen de datos y de que no contienen ningún carácter especial, como comillas y barras diagonales inversas, que podrían no ser seguras.

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. Si cancela el evento Validating, los datos no se sincronizarán con el origen de datos.

Importante

Si la validación personalizada que tiene se lleva a cabo después del evento Validating, no afectará al enlace de datos. Por ejemplo, si tiene código en un evento Validated que intenta cancelar el enlace de datos, este se seguirá produciendo. En este caso, para realizar la validación en el evento Validated, cambie la propiedad Modo de actualización del origen de datos del control (en (Databindings)\(Advanced)) de OnValidation a Never y agregue Control.DataBindings["<YOURFIELD>"].WriteValue() al código de validación.

Validación implícita y explícita

¿Cuándo se validan los datos de un control? Depende del desarrollador. Puede usar la validación implícita o explícita, en función de las necesidades de la aplicación.

Validación implícita

El enfoque de validación implícita valida los datos a medida que el usuario los escribe. Puede validar los datos a medida que se escriban en un control leyendo las teclas a medida que se presionan, o de forma normal cada vez que el usuario quite el foco de entrada de un control y se mueva al siguiente. Este enfoque es útil si quiere proporcionar al usuario comentarios inmediatos sobre los datos mientras trabaja.

Si quiere usar la validación implícita para un control, debe establecer la propiedad AutoValidate de ese control en EnablePreventFocusChange o EnableAllowFocusChange. Si cancela el evento Validating, el comportamiento del control estará determinado por el valor que haya asignado a AutoValidate. Si ha asignado EnablePreventFocusChange, el resultado de cancelar el evento es que no se produzca el evento Validated. El foco de entrada permanecerá en el control actual hasta que el usuario cambie los datos a una entrada válida. Si ha asignado EnableAllowFocusChange, el evento Validated no se producirá cuando cancele el evento, pero el foco cambiará al siguiente control.

La asignación de Disable a la propiedad AutoValidate evita totalmente la validación implícita. Para validar los controles, tendrá que usar la validación explícita.

Validación explícita

El enfoque de validación explícita valida los datos de forma individual. Puede validar los datos en respuesta a una acción del usuario, como hacer clic en un botón Guardar o un vínculo Siguiente. Cuando se produce la acción del usuario, puede desencadenar la validación explícita de una de las siguientes maneras:

  • Llame a Validate para validar que el último control ha perdido el foco.

  • Llame a ValidateChildren para validar todos los controles secundarios de un formulario o control contenedor.

  • Llame a un método personalizado para validar manualmente los datos de los controles.

Comportamiento de validación implícita predeterminado para controles de Windows Forms

Los distintos controles de Windows Forms tienen valores predeterminados diferentes para su propiedad AutoValidate. En la tabla siguiente se muestran los controles más comunes y sus valores predeterminados.

Control Comportamiento de validación predeterminado
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Propiedad no expuesta en Visual Studio
ToolStripContainer Propiedad no expuesta en Visual Studio
SplitContainer Inherit
UserControl EnableAllowFocusChange

Se cierra el formulario y se invalida la validación

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:

  • Haciendo clic en el botón Cerrar.

  • Al seleccionar Cerrar en el menú Sistema.

  • Llamando al método Close mediante programación.

Pero en algunos casos, es posible que quiera permitir que el usuario cierre el formulario independientemente de si los valores de los controles son válidos. Puede invalidar la validación y cerrar un formulario que todavía contiene datos no válidos si crea un controlador para el evento FormClosing del formulario. En el evento, establezca la propiedad Cancel en false. Esto fuerza el cierre del formulario. Para obtener más información y un ejemplo, vea Form.FormClosing.

Nota:

Si fuerza el cierre del formulario de esta manera, se perderán los datos de los controles del formulario que todavía no se hayan guardado. Además, los formularios modales no validan el contenido de los controles cuando se cierran. Todavía podrá usar la validación de controles para bloquear el foco en un control, pero no tendrá que preocuparse del comportamiento asociado al cierre del formulario.

Vea también