2009-03-04 17 views
8

Ho implementato le regole di convalida su un textBox nel mio WinForm e funziona bene. Comunque controlla la validazione solo quando esco dal campo. Vorrei controllare non appena qualcosa è stato inserito nella confezione e ogni volta che il contenuto cambia. Vorrei anche controllare la convalida non appena si apre WinForm.Convalida modifica del testo in TextBox

Mi ricordo di averlo fatto abbastanza recentemente impostando alcuni eventi e quant'altro, ma non riesco a ricordare come.

risposta

4

TextChanged

in futuro è possibile trovare tutti gli eventi su MSDN Library, ecco la TextBox class reference:

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

+0

L'evento TextChanged si attiva solo dopo aver perso l'attenzione dal controllo (ad esempio da una scheda). Questo impedirà l'inserimento di dati non validi una volta che te ne sarai andato. L'OP sembra voler impedire che venga sempre consentito il periodo. – TheTXI

+8

Non è accurato, TextChanged si attiva indipendentemente dalla messa a fuoco. –

+0

Sono stato corretto – TheTXI

1

Dovresti controllare gli eventi KeyPress o KeyDown e non solo l'evento TextChanged.

Ecco un C# esempio diretto dal MSDN documentation: evento

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

Penso che si shoud controllare TextValueChanged così, come qualcuno potrebbe semplicemente "Incolla" caratteri illegali :) –

+1

Questo metodo non funziona con Incolla (bloccherà il CTRL-V, ma non controllerà il menu contestuale della casella di testo "incolla"). Dovrai gestirlo separatamente. – xanatos

1

Come saranno validi i dati se non sono stati completati? Ad esempio, un utente digita un numero e tu provi a convalidarlo come una data?

+0

la mia ipotesi è un campo numerico che non può contenere lettere, o viceversa – Jason

+1

Questo è abbastanza comune se si vuole impedire che le persone inseriscano caratteri non validi. Se controlli KeyPress o KeyDown, puoi intercettare l'input e impedirgli di mostrarlo. – TheTXI

+1

Questo è il punto. I dati non sono validi quando non sono finiti, quindi vorremmo che l'errore venisse visualizzato ogni volta che il campo contiene dati non validi. Ciò include all'avvio e durante la digitazione finché i dati non sono ancora validi. – Sakkle

5

Se si utilizza l'associazione dati, passare alle Proprietà della casella di testo. Apri (DataBindings) in alto, fai clic sulla proprietà (Avanzata), appariranno tre punti (...) Clicca su quelli. Viene visualizzata la schermata di associazione dei dati avanzata. Per ogni proprietà del TextBox vincolato, nel tuo caso Text, puoi impostare quando il databinding, e quindi la validazione, dovrebbe "kick in" usando la combobox Data Source Update mode. Se lo si imposta su OnPropertyChanged, verrà rivalutato durante la digitazione (il valore predefinito è OnValidation, che viene aggiornato solo come scheda).

+0

soluzione più veloce, più semplice e più pulita – Florian

1

Quando si associa la casella di testo a un bindingSource, passare a Avanzate e selezionare il tipo di convalida
"Sulla proprietà modificata". Questo propagherà i tuoi dati all'entità su ogni pressione dei tasti. Here is the screen shot

Problemi correlati