Logo UGIdotNET

Discussione 'Proprietà collegate a controlli TextBox'

# Pubblicato il 29 lug 2004 15.48 - Rispondi
Jonathan Zanardi
Proprietà collegate a controlli TextBox
Ciao a tutti,
ho una situazione un po' particolare che mi sta creando diversi dubbi a cui ancora non sono riuscito a dare una risposta.
Sto sviluppando un'applicazione con CompactFramework in cui un controllo TextBox di un form è collegato ad una proprietà di una mia classe. Il metodo set della proprietà contiene la logica di validazione del membro privato contenuto nella classe ed è quindi implementata per sollevare delle eccezioni nel caso in cui venga inserito un valore non valido. Ad esempio:
public string OperazioneContabile{
get{ return opCont;}
set{
if ((value == null) && (value == ""))
throw new Exception ("Impossibile settare un valore nullo");
if (value.Length != 3)
throw new Exception("Impossibile impostare il valore: lunghezza richiesta 3 car.");

opCont = value;
}
}

Il problema è che avendo collegato la proprietà ad un controllo TextBox ogni volta che esco dal controllo dopo aver digitato qualcosa viene invocato il set della proprietà. In primo luogo non si tratta di un comportamento molto "simpatico" visto che l'utente potrebbe cominciare a scrivere qualcosa per poi spostarsi su altri controlli mentre l'invocazione del set richiede che sia digitato tutto correttamente. Come si fa ad evitare il set ad ogni perdita di focus? preferirei poter fare la validazione tramite un pulsante apposito....
come soluzione pensavo di fare il DataBinding solo all'ultimo momento, ci sono alternative?

In secondo luogo l'eccezione che sollevo all'interno del set non viene gestita al di fuori del corpo del metodo... il debugger si interrompe mostrandomi il testo dell'eccezione. Ma non è possibile gestirla al di fuori del corpo del set l'eccezione?

Spero di essermi spiegato in maniera comprensibile.... :)

Bye
John
# Pubblicato il 29 lug 2004 21.20 - Rispondi
Ernest Morariu
Re: Proprietà collegate a controlli TextBox

Fai la validazione al livello del form utilizzando gli eventi
TextBox.Validating.

Se vuoi fare la validazione tramite un pulsante allora forse devi rinunciare
all binding. Come alternativa, togli tutti i throw delle proprietà del tuo
controllo, quindi implementa un metodo pubblico chiamato ValidazioneDati che
torna True o False .

ernest


----------------------
Questo messaggio è stato postato da microsoft.public.it.dotnet.csharp.
# Pubblicato il 30 lug 2004 10.52 - Rispondi
Jonathan Zanardi
Re: Proprietà collegate a controlli TextBox
on 29. Jul 2004 21:20 Ernest Morariu wrote:

Grazie per la risposta.

> Se vuoi fare la validazione tramite un pulsante allora forse devi rinunciare
> all binding. Come alternativa, togli tutti i throw delle proprietà del tuo
> controllo, quindi implementa un metodo pubblico chiamato ValidazioneDati che
> torna True o False .

Mmmm non mi piace molto come soluzione: la logica di validazione è nelle proprietà ed è giusto che stia lì! Se per caso riutilizzo quelle proprietà settandole via codice la validazione è già nel metodo set e non mi devo preoccupare di richiamare un metodo di validazione peraltro generale per tutte le proprietà!

La strada che sto seguendo è quella di eseguire il bind per recuperare i valori dall'oggetto Configuratore per poi staccare subito i controlli richiamando il Clear del binding. Successivamente quando desidero validare rieseguo il bind (il metodo è sempre lo stesso)..... il problema è che quando si esegue il bind la prima cosa che viene fatta è il get dei valori dalle proprietà collegate che quindi va a sovrascrivere il contenuto del TextBox che l'utente ha modificato.... mi tocca quindi fare una cache dei valori inseriti prima di eseguire il bind!

Incasinato eh? ;)

Bye
John
# Pubblicato il 30 lug 2004 11.24 - Rispondi
Ernest Morariu
Re: Proprietà collegate a controlli TextBox

Credo che la soluzione migliore sia di giocare con i metodi SuspendBinding e
ResumeBinding della classe BindingManagerBase:
bindi i controlli alle proprietà della tua classe e, dopo che è stato fatto
il load dei dati, chiami SuspendBinding. Alla fine, dopo che hai fatto la
validazione, chiami ResumeBinding.

ernest


"UGI 7490" <UGI7490_TOGLIQUESTASTRINGA@_TOGLIQUESTASTRINGAugidotnet.org>
wrote in message news:b2ff3c5c-5d0d-475e-95f5-3c633b0e2d90@UGI41372...
> on 29. Jul 2004 21:20 Ernest Morariu wrote:
>
> Grazie per la risposta.
>
> > Se vuoi fare la validazione tramite un pulsante allora forse devi
rinunciare
> > all binding. Come alternativa, togli tutti i throw delle proprietà del
tuo
> > controllo, quindi implementa un metodo pubblico chiamato ValidazioneDati
che
> > torna True o False .
>
> Mmmm non mi piace molto come soluzione: la logica di validazione è nelle
> proprietà ed è giusto che stia lì! Se per caso riutilizzo quelle proprietà
> settandole via codice la validazione è già nel metodo set e non mi devo
> preoccupare di richiamare un metodo di validazione peraltro generale per
tutte
> le proprietà!
>
> La strada che sto seguendo è quella di eseguire il bind per recuperare i
valori
> dall'oggetto Configuratore per poi staccare subito i controlli richiamando
il
> Clear del binding. Successivamente quando desidero validare rieseguo il
bind
> (il metodo è sempre lo stesso)..... il problema è che quando si esegue il
bind
> la prima cosa che viene fatta è il get dei valori dalle proprietà
collegate che
> quindi va a sovrascrivere il contenuto del TextBox che l'utente ha
> modificato.... mi tocca quindi fare una cache dei valori inseriti prima di
> eseguire il bind!
>
> Incasinato eh? ;)
>
> Bye
> John
> ----------------------
> Questo messaggio è stato postato da http://www.ugidotnet.org/forum
> UGIdotNET - User Group Italiano .NET


----------------------
Questo messaggio è stato postato da microsoft.public.it.dotnet.csharp.
# Pubblicato il 31 lug 2004 11.57 - Rispondi
Jonathan Zanardi
Re: Proprietà collegate a controlli TextBox
Acc.... per un attimo ho sperato che funzionasse! Il CompactFramework non supporta quei metodi :((

Peccato!

Bye
John

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185