2009-03-05 12 views

Respuesta

13

No se olvide de los siguientes temas/esquina-casos que se le enfrenta, si vas por la ruta propuesta:

  • Los usuarios pueden utilizar Ctrl - V o Shift - Inserte para pegar valores "no válidos" en (Ese segundo es un poco más complicado de atrapar) ... pero los usuarios probablemente deberían poder pegar valores legales en el control
  • Los usuarios pueden hacer clic derecho, pegar valores no válidos en usi ng el menú de contexto predeterminado
  • Incluso si ha intentado solucionar el problema anterior dando al cuadro de texto su propio menú contextual, los usuarios pueden hacer clic derecho fuera de su control, mantener presionado el botón derecho, arrastrar sobre su cuadro de texto y dejar ir para acceder al menú de contexto por defecto (y pegar en valores no válidos)
  • lo procesamiento de clave que haces no debe desactivar las combinaciones de teclas como Alt - F4, etc. (y sí, va a romper esto si configure SuppressKeyPress para todo lo que no sea un dígito válido)
  • Los usuarios probablemente deberían poder ingresar valores parciales (ej."-.", a medida que comienzan a escribir "-.23") sin su cuadro de texto a castigar
  • números como "-.1e-2" puede considerarse legal
  • Un usuario podría introducir factible un valor que contiene sólo dígitos, pero que se hubiera sobrepasado un float
  • El el peor de todos: Algún otro caso misterioso de la esquina que tus usuarios encontrarán después de que hayas enviado (!!)

The moral? Puede ser muy complicado hacer lo que sugieres.

Probablemente tampoco quieren hacer una combinación de los siguientes:

  • utilizar un control que alguien que conoce todos los casos de esquina construidos (como Microsoft)
  • hacer en la validación básica en caso TextChanged (y hacer algo pasivo, como cambiar el color de fondo de texto)
  • Guardar la validación hasta que realmente se intenta utilizar el valor que haya escrito en
  • utilizar las bibliotecas del sistema de Parse valor del usuario para usted
+0

Gah, muchos casos extremos de los que ocuparse. Odio a los usuarios ...;) –

+0

@ecarF: No es broma; por eso es tan doloroso construir realmente un control de entrada robusto como lo está pidiendo el OP. –

+0

Sí, espere a que el usuario finalice lo que está haciendo (presione OK), luego presione el valor con una expresión regular y continúe o lance un MessageBox. Mucho mejor que anular OnKeyPress. – Karl

2

Eche un vistazo al control MaskedTextBox. También hereda de TextBoxBase y probablemente tiene la funcionalidad que estás creando en la tuya.

+0

Gracias por la respuesta rápida, Mike. De hecho investigué el control MaskedTextBox antes de recurrir al trabajo manual, sin embargo, no pude lograr que se comportara como quería de la caja con números de coma flotante. Tal vez hice algo tonto, aunque ... –

+0

No creo que MaskedTextBox pueda hacer algo bueno aquí, ya que no parece permitir un número infinito (definido por el usuario) de caracteres. –

0

No creo que la rueda se haya inventado todavía (al menos en el marco .NET). Estoy seguro de que hay algo en CodeProject o similar, haciendo algo similar a lo que eres, por lo que puede valer la pena un Google.

Sin embargo, el trabajo pesado no debería ser demasiado malo. Hay un poco más de lo que a primera vista.

El ejemplo demasiado simplificado es que puede manejar OnKeyPress, haga un Float.TryParse con el nuevo carácter adjunto. Si es verdadero, mantenga presionada la tecla; si es falso, cancélelo (e.Handled = true).

La parte difícil es qué si eliminan, cortan o pegan una selección. La otra cosa es cuando se acaba de empezar (es posible que desee aceptar la entrada "-" válida como parcial) ...

+0

http://www.codeproject.com/KB/edit/RegexText.aspx parece que lo hacen. –

+0

Gracias por su sugerencia, pero no es tan simple. ¿Qué sucede si el usuario cambia la posición de los cuidados? Por lo que puedo ver, no puedes anexar ciegamente. –

+0

Gracias por el enlace VirualBlackFox. Definitivamente voy a echar un vistazo. –

0

o detectar partido usando

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    if(..) // your condition 
    { 
    e.SuppressKeyPress = false; 
    } 
    else 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

o

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method 
} 
1

¿Qué hay de usar un NumericUpDown?

0

descubrí la propiedad de un ValidatingType MaskedTextBox:

maskedTextBox1.ValidatingType = typeof(System.Double); 

lo hace de hecho te dice si es válido o no. Desafortunadamente, solo parece validar cuando el foco cambia (y aun así en realidad no hace nada); pero tal vez hay alguna forma de usar esto.

+0

Puede llamar al método "ValidateText" siempre que lo desee. Por lo tanto, para alejarse de la restricción de cambio de foco, configure un controlador para TextChanged y diga si (maskedTextBox1.MaskCompleted) {maskedTextBox1.ValidateText(); } – CJBrew

0

¿Es necesario hacer la validación durante la entrada de datos, o puede permitirse verificar el valor final ingresado una vez que se pierde el foco?

En este último caso, también puede usar un control ErrorProvider para ayudar a restringir la funcionalidad hasta que se resuelva la entrada.

+0

Gracias, creo que debería haber explicado mejor. Estoy validando la entrada del usuario durante la entrada de datos. –

Cuestiones relacionadas