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!
A dire la verità la cosa strana è proprio che prima appare la finestra di messaggio, e poi la finestra si chiude comunque...
Cosa che, con l'ErrorProvider, non dovrebbe invece dare problemi (l'utente non vedrebbe il messaggio di errore e la finestra si chiuderebbe comunque).