Originariamente inviato da alka
Pensandoci bene, credo che il problema sia derivato in fondo dal modo in cui viene effettuata la
validazione in Windows Forms.
Se i controlli hanno la proprietà
CausesValidation impostata a True, significa che il loro contenuto viene validato prima che sia consentito il passaggio del "focus" ad un controllo differente.
Nel tuo caso, come in ogni caso analogo, se si preme il pulsante di chiusura, si cerca di spostare il focus dalla casella di testo al pulsante; se la casella di testo contiene dati non validi e questi vengono segnalati come tali attraverso l'evento
Validating, il focus non si sposta dalla casella di testo e il pulsante non può essere premuto.
Personalmente, trovo molto fastidioso i programmi che segnalano errori usando caselle di messaggio, ancora di più se l'errore mi viene segnalato proprio mentre sto digitando (potrei voler completare altri campi prima di quello interessato, oppure introdurre qualcosa di modificabile successivamente e così via)... insomma, credo che per conformità allo standard, all'interno di una finestra di dialogo, qualsiasi segnalazione d'errore debba essere fornita solamente al momento della chiusura, quando si tenta di confermare ciò che si inserisce nei campi di cui è composta.
Potresti modificare il tuo codice di validazione in modo che adotti meccanismi diversi, più tolleranti e... rilassanti.
Ad esempio, potresti sfruttare il componente
ErrorProvider per visualizzare discretamente l'errore quando fallisce una validazione, senza usare finestre di messaggio, magari introducendo il controllo nell'evento
Validated, consentendo comunque lo spostamento del focus anche in caso di errore. Quando viene premuto il pulsante di conferma/salvataggio, ti sarà sufficiente verificare se permane sui campi del form una qualsivoglia condizione di errore personalizzata per visualizzare un'apposita segnalazione o impedire in qualche modo la prosecuzione dell'operazione. Quando premi il pulsante di annullamento, invece, non fai nulla, ignori tutto e consenti alla finestra di chiudersi regolarmente. E' sufficiente ricordarsi poi di usare correttamente le costanti
DialogResult e l'omonima proprietà del form per restituire l'esito dell'operazione al form o al metodo chiamante.
Ciao!