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 controllo MaskedTextBox. 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 inserisce un dato errato, ad esempio 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 utilizzato 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 da rispettare le specifiche del campo dati.
Per ulteriori informazioni, vedere il controllo "MaskedTextBox" .
Event-Driven convalida
Se si desidera un controllo a livello di codice completo sulla convalida o se è necessario eseguire controlli di convalida complessi, è consigliabile usare gli eventi di convalida incorporati nella maggior parte dei controlli Windows Form. Ogni controllo che accetta l'input utente in formato libero ha un evento Validating che si verifica ogni volta che il controllo richiede la convalida dei dati. Nel metodo di gestione degli eventi Validating è 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 regolare^(\d{5})(-\d{4})?$
. Per convalidare il moduloA#A #A#
, è possibile usare l'espressione regolare[A-Z]\d[A-Z] \d[A-Z]\d
. Per altre informazioni sulle espressioni regolari, vedere espressioni regolari di .NET Framework e esempi di espressioni regolari.Se il codice postale deve essere un codice postale valido per gli Stati Uniti, è possibile chiamare un servizio Web con codice postale per convalidare i dati immessi dall'utente.
All'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à Cancel dell'oggetto su true
. Se non si imposta la proprietà Cancel, Windows Form presuppone che la convalida abbia avuto esito positivo per tale controllo e generi l'evento Validated.
Per un esempio di codice che convalida un indirizzo di posta elettronica in un TextBox, vedere Validating.
Data Binding e convalida Event-Driven
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 utilizzi il data binding, i dati del tuo 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 hai una convalida personalizzata che avviene dopo l'evento Validating, non influirà sul data binding. Ad esempio, se disponete di codice in un evento Validated che tenta di annullare il data binding, il data binding avrà comunque luogo. In questo caso, per eseguire la convalida nell'evento
Convalida implicita ed esplicita
Quando vengono convalidati i dati di un controllo? Dipende da te, 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 mentre vengono immessi in un controllo monitorando la pressione dei tasti o, più comunemente, ogni volta che l'utente toglie l'attenzione da un controllo e passa a quello 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à AutoValidate del 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. La messa a fuoco dell'input rimarrà sul controllo corrente fino a quando l'utente non modificherà i dati in un input valido. Se hai assegnato EnableAllowFocusChange, l'evento Validated non si verificherà quando annulli l'evento, ma il focus si sposterà comunque al controllo successivo.
L'assegnazione di Disable alla proprietà AutoValidate 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 che ha perso lo stato attivo.
Chiamare ValidateChildren per convalidare tutti i controlli figlio in un modulo 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
I diversi controlli Windows Forms hanno diverse impostazioni predefinite per la loro 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 metodo Close 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 FormClosing del modulo. Durante l'evento, impostare la proprietà Cancel su false
. Questo forza il modulo a chiudersi. 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 il focus su un controllo, ma non è necessario preoccuparsi del comportamento associato alla chiusura del modulo.
Vedere anche
- Control.Validating
- Form.FormClosing
- System.Windows.Forms.FormClosingEventArgs
- del controllo MaskedTextBox
- Esempi di espressioni regolari
.NET Desktop feedback