Tengo una aplicación de formularios de Windows con un control de cuadro de texto que solo quiero aceptar valores enteros. En el pasado, he realizado este tipo de validación sobrecargando el evento KeyPress y simplemente eliminando caracteres que no se ajustaban a la especificación. He examinado el control MaskedTextBox, pero me gustaría una solución más general que podría funcionar con una expresión regular o depender de los valores de otros controles.
Idealmente, esto se comportaría de manera tal que presionar un carácter no numérico no produciría ningún resultado o proporcionaría inmediatamente al usuario comentarios sobre el carácter no válido.
Respuestas:
Dos opciones:
Use un
NumericUpDown
en su lugar. NumericUpDown hace el filtrado por usted, lo cual es bueno. Por supuesto, también brinda a sus usuarios la capacidad de presionar las flechas hacia arriba y hacia abajo en el teclado para aumentar y disminuir el valor actual.Maneje los eventos de teclado apropiados para evitar cualquier cosa que no sea entrada numérica. He tenido éxito con estos dos controladores de eventos en un TextBox estándar:
Puede eliminar la comprobación de
'.'
(y la comprobación posterior de más de uno'.'
) si su TextBox no debe permitir lugares decimales. También puede agregar una verificación para ver'-'
si su TextBox debe permitir valores negativos.Si desea limitar el número de dígitos al usuario, use:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
fuente
Y solo porque siempre es más divertido hacer cosas en una línea ...
NOTA: Esto NO impide que un usuario copie / pegue en este cuadro de texto. No es una forma segura de desinfectar sus datos.
fuente
KeyPress
eventos desde el mismo cuadro de texto. Un evento podría establecersee.Handled
en verdadero, y luego otro podría volver a establecerlo en falso. En general, es mejor usarif (...) e.Handled = true;
TextChanged
evento que lo supera con una expresión regular puede arreglar copiar y pegar;)Supongo por contexto y las etiquetas que usó que está escribiendo una aplicación .NET C #. En este caso, puede suscribirse al evento de cambio de texto y validar cada pulsación de tecla.
fuente
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Aquí hay un control personalizado de Winforms simple e independiente, derivado del cuadro de texto estándar, que solo permite la entrada System.Int32 (podría adaptarse fácilmente para otros tipos como System.Int64, etc.). Admite operaciones de copiar / pegar y números negativos:
Actualización 2017 : mi primera respuesta tiene algunos problemas:
Así que se me ocurrió otra versión que es más genérica, que todavía admite copiar / pegar, + y - firmar, etc.
Para Int32, puede derivar de él, así:
o sin derivación, use el nuevo evento TextValidating como este:
pero lo bueno es que funciona con cualquier cadena y cualquier rutina de validación.
fuente
Esto es exactamente para lo que se diseñaron los eventos Validated / Validating.
Aquí está el artículo de MSDN sobre el tema: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
La versión TL; DR: verifique la propiedad .Text en el evento Validating y configure
e.Cancel=True
cuando los datos no sean válidos.Cuando configura e.Cancel = True, el usuario no puede abandonar el campo, pero tendrá que darles algún tipo de retroalimentación de que algo está mal. Cambio el color de fondo del cuadro a rojo claro para indicar un problema. Asegúrese de volver a establecerlo
SystemColors.Window
cuando se llame a Validar con un buen valor.fuente
Validating
.<nitpick>
El OP menciona que lo ideal es rechazar / indicar de inmediato un carácter invalidante, peroValidating
parece requerir que el foco se mueva a otra forma / control antes de que surta efecto.</nitpick>
Aún así, este es un gran enfoque y siempre vale la pena considerarlo en el caso más general.Prueba un MaskedTextBox . Toma un formato de máscara simple para que pueda limitar la entrada a números o fechas o lo que sea.
fuente
Puedes usar el
TextChanged
eventofuente
Undo()
, pero resulta en unStackOverflowException
.public int txtBoxValue
, y si tryParse no funciona, revierto el texto en txtBox portxtBox.Text = txtBoxValue.ToString();
Esto puede ser útil. Permite valores numéricos "reales", incluidos los puntos decimales adecuados y los signos más o menos anteriores. Llámalo desde el evento KeyPress relacionado.
fuente
He estado trabajando en una colección de componentes para completar las cosas que faltan en WinForms, aquí está: Formularios avanzados
En particular, esta es la clase para un Regex TextBox
Simplemente agregar algo como
myNumbericTextBox.RegexString = "^(\\d+|)$";
debería ser suficiente.fuente
Simplemente use un
NumericUpDown
control y configure la visibilidad de esos botones feos hacia arribafalse
.NumericUpDown
en realidad es una colección de controles que contiene un 'cuadro giratorio' (botones arriba-abajo), un cuadro de texto y un código para validar y juntar todo.Calificación:
ocultará los botones mientras mantiene activo el código subyacente.
Si bien no es una solución obvia, es simple y eficaz.
.Controls[1]
ocultaría la parte del cuadro de texto si quisieras hacer eso en su lugar.fuente
He hecho algo para esto en CodePlex .
Funciona interceptando el evento TextChanged. Si el resultado es un buen número, se almacenará. Si algo está mal, se restaurará el último buen valor. La fuente es demasiado grande para publicar aquí, pero aquí hay un enlace a la clase que maneja el núcleo de esta lógica.
fuente
simplemente use este código en el cuadro de texto:
fuente
En nuestra página web con la definición de cuadro de texto, podemos agregar un
onkeypress
evento para aceptar solo números. No mostrará ningún mensaje, pero evitará que ingreses incorrectamente. A mí me funcionó, el usuario no pudo ingresar nada excepto el número.fuente
puede usar el evento TextChanged / Keypress, usar una expresión regular para filtrar los números y tomar alguna medida.
fuente
Lo manejaría en el evento KeyDown.
fuente
prueba esto es muy simple
fuente
Eche un vistazo al manejo de entrada en WinForm
He publicado mi solución que utiliza los eventos ProcessCmdKey y OnKeyPress en el cuadro de texto. Los comentarios le muestran cómo usar una expresión regular para verificar la pulsación de teclas y bloquear / permitir adecuadamente.
fuente
Hola, puedes hacer algo como esto en el evento de cambio de texto del cuadro de texto.
aquí hay una demostración
fuente
Parece que muchas de las respuestas actuales a esta pregunta analizan manualmente el texto de entrada. Si está buscando un tipo numérico incorporado específico (p. Ej.
int
Odouble
), ¿por qué no simplemente delegar el trabajo alTryParse
método de ese tipo ? Por ejemplo:Si quieres algo más genérico pero compatible con el diseñador de Visual Studio:
Y finalmente, si quieres algo completamente genérico y no te importa el soporte de Designer:
fuente
Se deben aceptar números enteros y flotantes, incluidos los números negativos.
fuente
Este es mi enfoque:
y cualquier número de tamaño
fuente
Usando el enfoque descrito en la respuesta de Fabio Iotti, he creado una solución más genérica:
"ValidatedTextBox", que contiene todo el comportamiento de validación no trivial. Todo lo que queda por hacer es heredar de esta clase y anular el método "IsValid" con cualquier lógica de validación requerida. Por ejemplo, usando esta clase, es posible crear "RegexedTextBox" que aceptará solo cadenas que coincidan con expresiones regulares específicas:
Después de eso, heredando de la clase "RegexedTextBox", podemos crear fácilmente los controles "PositiveNumberTextBox" y "PositiveFloatingPointNumberTextBox":
fuente
Lamento despertar a los muertos, pero pensé que alguien podría encontrar esto útil para referencia futura.
Así es como lo manejo. Maneja números de coma flotante, pero puede modificarse fácilmente para enteros.
Básicamente solo puede presionar 0 - 9 y .
Solo puede tener un 0 antes del .
Todos los demás caracteres se ignoran y se mantiene la posición del cursor.
Aquí hay una versión int rápidamente modificada:
fuente
Este funciona con copiar y pegar, arrastrar y soltar, presionar tecla, evita el desbordamiento y es bastante simple
fuente
No olvide que un usuario puede pegar un texto no válido en un
TextBox
.Si desea restringir eso, siga el siguiente código:
fuente
También estaba buscando la mejor manera de verificar solo los números en el cuadro de texto y el problema con la pulsación de teclas es que no admite copiar y pegar haciendo clic con el botón derecho o en el portapapeles, así que se me ocurrió este código que valida el cursor cuando sale del campo de texto y también busca campo vacío. (versión adaptada de newguy)
fuente
fuente
3 solución
1)
2) otra solución de msdn
}
fuente http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) usando MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
fuente
Al hacer clic en el botón, puede verificar el texto del cuadro de texto por bucle:
fuente
Respuesta más simple:
fuente