Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

[MCAD.6] Un evento tra tutti gli altri: il Validating della TextBox

Pierre in un suo post di qualche giorno fa, ha detto (testuali parole): "Si inizia spiegando i concetti base, quelli che spesso crediamo di avere chiari ma poi scopriamo che abbiamo delle falle ". Lui si riferiva a ben altro, ma sono convinto anche io di quello che ha detto. E' quello che ho voluto fare con il mio post dell'altra volta, cominciando a parlare di eventi. Se volete approfondire, ho trovato questa pagina su MSDN. Oggi andiamo avanti.

Dunque, un altro argomento che Lorenzo ha trattato nella sua Study Guide è l'evento Validating delle TextBox. Secondo Lorenzo...the best way to validate user input is to check the status of a control before it loses focus. L'evento Validating fa proprio questo. In pratica, il controllo TextBox scatena l'evento Validating quando il controllo sta per perdere il focus. Sempre, in ogni caso? A dir la verità no, ma ce ne occuperemo dopo. Per adesso ci basta questo.

Supponiamo quindi di avere una WF frmMain, una brava TextBox txtBirthYear e un button btnCalcola. Vogliamo creare un'app che ci dica quanti anni abbiamo, perciò ci aspettiamo che lo user inserisca nella TextBox il suo anno di nascita (1976 o 1980, per esempio). Vedremo di gestire il Validating per validare l'input. Nell'altro post per gestire l'evento Click del button abbiamo fatto semplicemente doppio-click sul button stesso, e l'IDE ha fatto tutto il resto. Lo facciamo anche adesso: facciamo doppio-click sulla TextBox ma vediamo che questa volta viene creato il codice per l'evento TextChanged della TextBox:

private void txtBirthYear_TextChanged(object sender, System.EventArgs e)
{ }

Non è quello che ci serve. Come facciamo a creare codice per l'evento giusto? Io che arrivo da VB.NET ci ho messo un po' per capirlo. In breve: usate la Property Window (PW). Tornate al designer, selezionate la TextBox, aprite la PW, andate negli eventi e fate doppio-click sulla riga Validating. Adesso abbiamo il codice giusto:

private void txtBirthYear_Validating(object sender, System.ComponentModel.CancelEventArgs e) { }

Adesso possiamo scrivere il codice C# che fa funzionare il nostro giocattolo!

private void txtBirthYear_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (this.txtBirthYear.Text.Length != 4) e.Cancel = true;
}

private void btnCalcola_Click(object sender, System.EventArgs e)
{
int anno = Convert.ToInt32(this.txtBirthYear.Text);
anno = System.DateTime.Now.Year - anno;
MessageBox.Show("Hai " + anno.ToString() + " anni!!!");
}

Ho un evento Validating sulla TextBox e un evento click sul button. La validazione fallisce (e.Cancel = true) se lo user scrive qualcosa più corto o più lungo di 4 caratteri! Bleah! Ok, proviamo ad eseguire. Nella TextBox scrivete il vostro anno di nascita e cliccate con il pulsante. A me dice 29. Se il vostro anno è lungo 4 caratteri (spero proprio di sì!!), allora ottenere la vostra età!!!

Noi però siamo qui per vedere l'evento Validating all'opera, giusto? Se nella TextBox scrivete "197", la validazione fallisce: il click sul button non dice nulla (anche se lo vediamo cliccare), il form non si chiude più. Validazione fallita. Va anche bene, però lo user non ha più controllo, perchè se la validazione fallisce, il focus rimane assolutamente inchiodato alla TextBox. Situazione bloccata, dite voi? Sembra di sì!!!

Quando prima ho accennato al fatto che il Validating non sempre viene scatenato, avevo lasciato in sospeso la questione. Adesso è il momento di risolverla. Il succo sta nel gestire la property CausesValidation dei controlli: va impostata a False su quei controlli che possono ricevere il focus senza scatenare la Validating del controllo da cui si proviene (cioè quello che attualmente il focus). Attenzione, sto studiando anche io per diventare MCAD, quindi potrei essere impreciso, confido sempre nella correzione di qualcuno.

Lorenzo nella Study Guide fa un esempio: impostare a False la CausesValidation sui pulsanti di help, perchè lo user deve comunque poterli cliccare anche se la situazione sui controlli della WF non è validata. Io aggiungo altro: se prevediamo un pulsante btnAnnulla per chiudere la WF, allora bisognerà mettere la CausesValidation = false:

// Codice dalla InitializeComponent chiamata dal costruttore della WF
//
// btnAnnulla
//
this.btnAnnulla.CausesValidation = false;
this.btnAnnulla.Location = new System.Drawing.Point(104, 40);
this.btnAnnulla.Name = "btnAnnulla";
this.btnAnnulla.Text = "Annulla";
this.btnAnnulla.Click += new System.EventHandler(this.btnAnnulla_Click);

//
// evento per gestire il Click
//
private
void btnAnnulla_Click(object sender, System.EventArgs e)
{ Application.Exit(); }

Compiliamo ed eseguiamo. Se la validazione passa, nessun problema. Se non passa, l'unico modo che abbiamo è cliccare sul button btnAnnulla: la WF si chiude, la Validating della TextBox non viene considerata e quindi viene eseguito il codice btnAnnulla_Click.

La Study Guide prosegue con l'utilizzo del componente ErrorProvider per dare indicazioni di errore allo user. Sarà argomento di un prossimo post.

powered by IMHO 1.2

Print | posted on giovedì 7 luglio 2005 19:00 | Filed Under [ MCAD ]

Feedback

Gravatar

# re: [MDAC.6] Un evento tra tutti gli altri: il Validating della TextBox

Bravo Igor per la spiegazione. Spero che molti miei colleghi (non posso fare nomi perché magari ci leggono) studino bene il tuo post perché invece dell'evento Validating utilizzano il Lost Focus.
Una sola precisazione a parere mio. Il controllo dell'anno non farlo sulla lunghezza dell'anno... non mi piace ;-) Inoltre così potrebbe essere inseriti dei caratteri alfanumerici. Sono cmq certo che lo sai meglio di me e che questo è solo un esempio.
07/07/2005 19:20 | Marco Santoni
Gravatar

# re: [MDAC.6] Un evento tra tutti gli altri: il Validating della TextBox

Rileggendo il mio feed precedente a questo tuo post mi sono reso conto di averlo scritto in un italiano orribile... sorry. ;-)
07/07/2005 19:22 | Marco Santoni
Gravatar

# re: [MDAC.6] Un evento tra tutti gli altri: il Validating della TextBox

hai fatto benissimo, però è come dici tu!!! Quel "Bleah!" inserito nel testo serve proprio per indicare lo schifo che ho avuto nello scrivere quell'if. :-)
però così mi sono aperto la strada per l'ErrorProvider e per il Try...Catch!
:-)))
07/07/2005 20:27 | Igor Damiani
Gravatar

# [MCAD.8] Completare l'evento Validating con il controllo ErrorProvider ed altre chicce

08/07/2005 16:22 | Technology Experience
Gravatar

# re: [MCAD.6] Un evento tra tutti gli altri: il Validating della TextBox

Una domanda:
Se al posto di Application.Exit() scrivo this.Close(), mi aspetto che la form venga chiusa. In realtà viene di nuovo generato l'evento Validating. Ho provato a impostare la proprietà CasusesValidation della form a false, ma l'evento Validating viene generato lo stesso. Ho l'impressione di commettere un grossolano errore...
13/07/2005 21:00 | Pippo
Gravatar

# re: [MCAD.6] Un evento tra tutti gli altri: il Validating della TextBox

Ho risolto impostando e.cancel=false nell'evento closing della form...
14/07/2005 13:50 | Pippo
Gravatar

# re: [MCAD.6] Un evento tra tutti gli altri: il Validating della TextBox

bravo! scusa se non ti ho risposto, ma oggi ero al workshop di UGIdotNET, e ho letto il tuo comment soltanto adesso!
per fortuna hai risolto da solo, hai fatto bene a postarlo, così è rimasta la soluzione per i posteri!
;-)
15/07/2005 00:58 | Igor Damiani
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET