Compartir a través de


Información general sobre cómo validar la entrada de usuario (Windows Forms para .NET)

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 o que una cadena no contenga caracteres no válidos. Windows Forms proporciona varias maneras de validar la entrada en la aplicación.

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

Validación controlada por eventos

Si quiere un control completo mediante programación sobre la validació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 escritos 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 escritos 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, vea Expresiones regulares de .NET 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, establezca la propiedad Cancel de este objeto en true para cancelar el evento Validating. 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, vea la referencia de eventos Validating.

Controles enlazados a datos de validación controlada por eventos

La validación es ú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 tiene validación personalizada que tiene lugar 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 Binding.DataSourceUpdateMode del control de DataSourceUpdateMode.OnValidation a DataSourceUpdateMode.Never y agregue your-control.DataBindings["field-name"].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. Para validar los datos se leen las teclas a medida que se presionan, o con mayor frecuencia, cada vez que el usuario toma el foco de entrada del control. 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 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 un formato válido. 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 los controles

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.
  • Seleccionando el menú Sistema>Cerrar.
  • 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 se cierran. Todavía puede usar la validación de controles para bloquear el foco en un control, pero no tiene que preocuparse del comportamiento asociado al cierre del formulario.

Vea también