Evento Validating. Ok per Windows Forms. Ma per Windows Mobile?
Introduzione per chi non sa di cosa si sta parlando
Facciamola breve. L’evento Validating è il metodo più vecchio per validare il contenuto di un controllo in un’applicazione Windows Forms. L’evento Validating si scatena un attimo prima che un determinato controllo perda il focus: nell’event handler implementate il controllo che volete, e se le cose non vanno come dovrebbero, impostate a true il valore della proprietà Cancel del parametro di tipo CancelEventArgs. Quindi, supponiamo:
1 private void textBox1_Validating(object sender, CancelEventArgs e) 2 { 3 if(string.IsNullOrEmpty(this.textBox1.Text)) 4 e.Cancel = true; 5 }
Il codice qui sopra valida il contenuto di una TextBox su una Windows Forms. Se la TextBox è vuota, non potete andarvene: dovete per forza digitare qualcosa.
Il discorso fatto sinora è valido fintantochè la proprietà CausesValidation della TextBox (più in generale…del controllo) è impostata a true. Se questa proprietà è impostata a false, l’evento Validating non viene più scatenato, e quindi i vostri controlli di validazione non vengono più eseguiti.
Per la serie…non si finisce mai di imparare
Ma non è finita qua. Oltre a CausesValidation, è possibile lavorare con la proprietà AutoValidate del form. Tecnicamente parlando, questa proprietà esiste per tutti i controlli che ereditano da ControlContainer (Panel, GroupBox, TabControl, etc.). Il valore di default è EnablePreventFocusChange: evita che il controllo perda il focus se la validazione non avviene con successo. Qui ci sono maggiori informazioni su questo argomento.
E’ possibile impostare AutoValidate a Disabled. Questo impedisce lo scatenarsi dell’evento Validating, anche se avete impostato CausesValidation a true per un determinato controllo. A cosa potrebbe servire? Gli scenari che mi sono venuti in mente sono fondamentalmente due:
- Non posso validare un controllo alla volta. Mi spiego meglio. Non sempre posso validare – per esempio – la TextBox su cui mi trovo senza tenere in considerazione altri controlli sulla Windows Form: controlli su cui magari devo ancora passare. Piccolo esempio: per validare una CodiceFiscaleTextBox sulla lunghezza (11 per partita iva o 16 per codice fiscale), devo anche controllare quale degli OptionButton l’utente ha selezionato, per indicare se è un privato o un utente aziendale.
- Voglio validare esplicitamente quando lo dico io.
Mettendo AutoValidate a Disabled, è sempre e comunque possibile validare il contenuto della Windows Form chiamando esplicitamente il metodo ValidateChildren(), che restituisce un booleano. Questo metodo itera su tutti i controlli della Windows Form e scatena l’evento Validating solo su quelli che hanno CausesValidation a true. La chiamata al metodo restituisce true se tutte le validazioni sono avvenute con successo; restituisce false se almeno una delle validazioni è fallita.
E su Mobile?
Il Compact Framework prevede l’evento Validating sui controlli. Ma non c’è modo di utilizzare AutoValidate sulla Form, e neppure di usare CausesValidation. A quest’ultima cosa è naturalmente possibile sopperire in modo abbastanza semplice, creando una classe che erediti da TextBox e che aggiunga questa proprietà booleana che esegua la validazione solo quando vale true.
Technorati Tags: .NET Framework Compact Framework validating