2009-03-04 34 views
8

He implementado reglas de validación en un cuadro de texto en mi WinForm y funciona bien. Sin embargo, comprueba la validación solo cuando cierro la pestaña fuera del campo. Me gustaría comprobarlo tan pronto como se ingrese algo en el cuadro y cada vez que cambie el contenido. También me gustaría comprobar la validación tan pronto como se abra WinForm.Validar en el cambio de texto en TextBox

Recuerdo haberlo hecho recientemente estableciendo algunos eventos y otras cosas, pero no puedo recordar cómo.

Respuesta

4

TextChanged

en el futuro se pueden encontrar todos los eventos en la biblioteca de MSDN, aquí está el TextBox class reference:

http://msdn.microsoft.com/en-us/library/system.windows.forms.textbox(VS.80).aspx

+0

El evento TextChanged solo se activará una vez que se haya perdido el foco del control (como desde una pestaña). Esto solo evitará que se ingresen datos no válidos una vez que se vaya. El OP parece querer evitar que se le permita el período. – TheTXI

+8

Eso no es exacto, TextChanged se dispara independientemente del enfoque. –

+0

Estoy corregido – TheTXI

1

Debe comprobar los eventos KeyPress o KeyDown y no solo su evento TextChanged.

Aquí está un ejemplo de C# directamente desde el MSDN documentation: caso

// Boolean flag used to determine when a character other than a number is entered. 
private bool nonNumberEntered = false; 

// Handle the KeyDown event to determine the type of character entered into the control. 
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Initialize the flag to false. 
    nonNumberEntered = false; 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     // Determine whether the keystroke is a number from the keypad. 
     if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) 
     { 
      // Determine whether the keystroke is a backspace. 
      if(e.KeyCode != Keys.Back) 
      { 
       // A non-numerical keystroke was pressed. 
       // Set the flag to true and evaluate in KeyPress event. 
       nonNumberEntered = true; 
      } 
     } 
    } 
    //If shift key was pressed, it's not a number. 
    if (Control.ModifierKeys == Keys.Shift) { 
     nonNumberEntered = true; 
    } 
} 

// This event occurs after the KeyDown event and can be used to prevent 
// characters from entering the control. 
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) 
{ 
    // Check for the flag being set in the KeyDown event. 
    if (nonNumberEntered == true) 
    { 
     // Stop the character from being entered into the control since it is non-numerical. 
     e.Handled = true; 
    } 
} 
+0

Creo que deberían poner comprueba textValueChanged así, como alguien podría simplemente "pegar" caracteres ilegales :) –

+1

Este método no funcionará con pasta (que bloqueará las teclas CTRL-V pero no comprobará el menú contextual del cuadro de texto "pegar"). Tendrá que manejarlo por separado. – xanatos

1

¿Cómo serán sus datos válidos si no están terminados? es decir, ¿un usuario teclea un número e intentas validarlo como una fecha?

+0

Supongo que es un campo numérico que no puede contener letras, o viceversa – Jason

+1

Esto es bastante común si desea evitar que las personas ingresen caracteres no válidos. Si comprueba KeyPress o KeyDown, puede interceptar la entrada y evitar que se muestre. – TheTXI

+1

Ese es todo el punto. Los datos no son válidos cuando no están finalizados, por lo que nos gustaría que el error aparezca siempre que el campo contenga datos no válidos. Esto incluye al inicio y al escribir, siempre y cuando los datos no sean válidos. – Sakkle

5

Si está utilizando enlace de datos, vaya a Propiedades del cuadro de texto. Abra (DataBindings) en la parte superior, haga clic en la propiedad (Avanzado), aparecerán tres puntos (...) Haga clic en esos. Aparece la pantalla de enlace de datos avanzado. Para cada propiedad del TextBox enlazado, en su caso Text, puede establecer cuándo el enlace de datos, y por lo tanto la validación, debe "activarse" con el combobox Data Source Update mode. Si lo configura en OnPropertyChanged, se volverá a evaluar a medida que escribe (el valor predeterminado es OnValidation, que solo se actualiza a medida que la pestaña).

+0

solución más rápida, más fácil y más limpia – Florian

1

Al vincular su cuadro de texto a un bindingSource, vaya a Avanzado y seleccione el tipo de validación
"En propiedad modificada". Esto propagará sus datos a su entidad en cada pulsación de tecla. Here is the screen shot

Cuestiones relacionadas