Convalida dell'input utente in Windows Form

Quando gli utenti immettono i dati nell'applicazione, è consigliabile verificare che i dati siano validi prima che vengano usati dall'applicazione. È possibile che determinati campi di testo non siano di lunghezza zero, che un campo venga formattato come numero di telefono o un altro tipo di dati ben formato oppure che una stringa non contenga caratteri non sicuri che potrebbero essere utilizzati per compromettere la sicurezza di un database. Windows Form offre diversi modi per convalidare l'input nell'applicazione.

Convalida con il controllo MaskedTextBox

Se è necessario richiedere agli utenti di immettere i dati in un formato ben definito, ad esempio un numero di telefono o un numero di parte, è possibile eseguire questa operazione in modo rapido e con codice minimo usando il MaskedTextBox controllo . Una maschera è una stringa costituita da caratteri di una lingua di maschera che specifica quali caratteri possono essere immessi in qualsiasi posizione nella casella di testo. Il controllo visualizza un set di richieste all'utente. Se l'utente digita una voce non corretta, ad esempio, l'utente digita una lettera quando è necessaria una cifra, il controllo rifiuterà automaticamente l'input.

Il linguaggio di maschera usato da MaskedTextBox è molto flessibile. Consente di specificare caratteri obbligatori, caratteri facoltativi, caratteri letterali, ad esempio trattini e parentesi, caratteri di valuta e separatori di data. Il controllo funziona anche correttamente se associato a un'origine dati. L'evento Format in un data binding può essere usato per riformattare i dati in ingresso in modo che siano conformi alla maschera e l'evento Parse può essere usato per riformattare i dati in uscita in modo che siano conformi alle specifiche del campo dati.

Per altre informazioni, vedere Controllo MaskedTextBox.

Convalida guidata dagli eventi

Se si vuole un controllo a livello di codice completo sulla convalida o è necessario eseguire controlli di convalida complessi, è consigliabile usare gli eventi di convalida incorporati nella maggior parte dei controlli Windows Form. Ogni controllo che accetta input utente in formato libero ha un Validating evento che si verifica ogni volta che il controllo richiede la convalida dei dati. Validating Nel metodo di gestione degli eventi è possibile convalidare l'input dell'utente in diversi modi. Ad esempio, se si dispone di una casella di testo che deve contenere un codice postale, è possibile eseguire la convalida nei modi seguenti:

  • Se il codice postale deve appartenere a un gruppo specifico di codici postali, è possibile eseguire un confronto di stringhe sull'input per convalidare i dati immessi dall'utente. Ad esempio, se il codice postale deve trovarsi nel set {10001, 10002, 10003}, è possibile usare un confronto di stringhe per convalidare i dati.

  • Se il codice postale deve trovarsi in un modulo specifico, è possibile utilizzare espressioni regolari per convalidare i dati immessi dall'utente. Ad esempio, per convalidare il modulo ##### o #####-####, è possibile usare l'espressione ^(\d{5})(-\d{4})?$regolare . Per convalidare il modulo A#A #A#, è possibile usare l'espressione [A-Z]\d[A-Z] \d[A-Z]\dregolare . Per altre informazioni sulle espressioni regolari, vedere Espressioni regolari di .NET Framework ed esempi di espressioni regolari.

  • Se il codice postale deve essere un codice postale valido Stati Uniti codice postale, è possibile chiamare un servizio Web con codice postale per convalidare i dati immessi dall'utente.

L'evento Validating viene fornito un oggetto di tipo CancelEventArgs. Se si determina che i dati del controllo non sono validi, è possibile annullare l'evento Validating impostando la proprietà dell'oggetto Cancel su true. Se non si imposta la Cancel proprietà , Windows Form presupporrà che la convalida sia riuscita per tale controllo e generi l'eventoValidated.

Per un esempio di codice che convalida un indirizzo di posta elettronica in un TextBox, vedere Validating.

Associazione dati e convalida guidata dagli eventi

La convalida è molto utile quando i controlli sono associati a un'origine dati, ad esempio una tabella di database. Usando la convalida, è possibile assicurarsi che i dati del controllo soddisfino il formato richiesto dall'origine dati e che non contengano caratteri speciali, ad esempio virgolette e barre rovesciata che potrebbero non essere sicuri.

Quando si usa il data binding, i dati nel controllo vengono sincronizzati con l'origine dati durante l'esecuzione dell'evento Validating . Se si annulla l'evento Validating , i dati non verranno sincronizzati con l'origine dati.

Importante

Se la convalida personalizzata viene eseguita dopo l'evento Validating , non influirà sul data binding. Ad esempio, se si dispone di codice in un Validated evento che tenta di annullare il data binding, il data binding si verificherà comunque. In questo caso, per eseguire la convalida nell'eventoValidated, modificare la proprietà Modalità di aggiornamento origine dati del controllo (in (Databindings)(Advanced)\) da OnValidation a Never e aggiungere Control<.DataBindings["YOURFIELD>"].WriteValue() al codice di convalida.

Convalida implicita ed esplicita

Quando vengono convalidati i dati di un controllo? Questo è per te, lo sviluppatore. È possibile usare la convalida implicita o esplicita, a seconda delle esigenze dell'applicazione.

Convalida implicita

L'approccio di convalida implicita convalida i dati man mano che l'utente lo immette. È possibile convalidare i dati quando i dati vengono immessi in un controllo leggendo i tasti quando vengono premuti o più comunemente ogni volta che l'utente allontana lo stato attivo di input da un controllo e passa al successivo. Questo approccio è utile quando si vuole fornire all'utente un feedback immediato sui dati mentre funzionano.

Se si desidera utilizzare la convalida implicita per un controllo, è necessario impostare la proprietà del AutoValidate controllo su EnablePreventFocusChange o EnableAllowFocusChange. Se si annulla l'evento Validating , il comportamento del controllo verrà determinato dal valore assegnato a AutoValidate. Se è stato assegnato EnablePreventFocusChange, l'annullamento dell'evento causerà la mancata esecuzione dell'evento Validated . Lo stato attivo dell'input rimarrà sul controllo corrente fino a quando l'utente non modifica i dati in un input valido. Se è stato assegnato EnableAllowFocusChange, l'evento Validated non si verificherà quando si annulla l'evento, ma lo stato attivo passerà comunque al controllo successivo.

L'assegnazione DisableAutoValidate alla proprietà impedisce completamente la convalida implicita. Per convalidare i controlli, è necessario usare la convalida esplicita.

Convalida esplicita

L'approccio di convalida esplicito convalida i dati contemporaneamente. È possibile convalidare i dati in risposta a un'azione dell'utente, ad esempio facendo clic su un pulsante Salva o su un collegamento Avanti. Quando si verifica l'azione dell'utente, è possibile attivare la convalida esplicita in uno dei modi seguenti:

  • Chiamare Validate per convalidare l'ultimo controllo per avere perso lo stato attivo.

  • Chiamare ValidateChildren per convalidare tutti i controlli figlio in una maschera o in un controllo contenitore.

  • Chiamare un metodo personalizzato per convalidare manualmente i dati nei controlli.

Comportamento di convalida implicita predefinito per i controlli Windows Form

Diversi controlli Windows Form hanno impostazioni predefinite diverse per la proprietàAutoValidate. Nella tabella seguente vengono illustrati i controlli più comuni e i relativi valori predefiniti.

Controllo Comportamento di convalida predefinito
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Proprietà non esposta in Visual Studio
ToolStripContainer Proprietà non esposta in Visual Studio
SplitContainer Inherit
UserControl EnableAllowFocusChange

Chiusura del modulo e override della convalida

Quando un controllo mantiene lo stato attivo perché i dati contenuti non sono validi, è impossibile chiudere il form padre in uno dei modi consueti:

  • Facendo clic sul pulsante Chiudi .

  • Selezionando Chiudi nel menu Sistema.

  • Chiamando il Close metodo a livello di codice.

In alcuni casi, tuttavia, potrebbe essere necessario consentire all'utente di chiudere il form indipendentemente dal fatto che i valori nei controlli siano validi. È possibile eseguire l'override della convalida e chiudere un modulo che contiene ancora dati non validi creando un gestore per l'evento del FormClosing modulo. Nell'evento impostare la Cancel proprietà su false. In questo modo il form viene chiuso. Per altre informazioni e un esempio, vedere Form.FormClosing.

Nota

Se si forza la chiusura del modulo in questo modo, tutti i dati nei controlli del modulo che non sono già stati salvati vengono persi. Inoltre, i moduli modali non convalidano il contenuto dei controlli quando vengono chiusi. È comunque possibile usare la convalida del controllo per bloccare lo stato attivo su un controllo, ma non è necessario preoccuparsi del comportamento associato alla chiusura del modulo.

Vedi anche