Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di newbie
    Registrato dal
    Dec 2005
    Messaggi
    299

    [VB.NET]FOrm_Closing e convalida dati

    In un form ho una casella di testo, il cui contenuto viene convalidato tramite l'evento Validating. Se il testo non è corretto (nel mio caso se la casella resta vuota), nell'evento faccio apparire una MessageBox di avviso, ed annullo la convalida (usando il Cancel). Fin qui tutto bene.
    I problemi vengono quando tento di chiudere il form... perchè, nonostante imposti il Cancel a False nel suo evento Closing, l'evento di convalida si ostina ad avvenire.... per giunta prima del Closing.

    Come posso costringere il form a chiudersi senza far avvenire la convalida (tanto le modifiche apportate al database sottostante, se i dati non sono validi, non vengono comunque fatte)?
    Svegliati, Neo. Matrix ti possiede...

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il pulsante dovrebbe avere la proprietà CausesValidation.

    Prova ad impostarla a False per verificare se in questo modo il controllo viene inibito.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di newbie
    Registrato dal
    Dec 2005
    Messaggi
    299
    Originariamente inviato da alka
    Il pulsante dovrebbe avere la proprietà CausesValidation.

    Prova ad impostarla a False per verificare se in questo modo il controllo viene inibito.

    Ciao!
    Nonostante MSDN dica il contrario, l'odiosissima MessageBox appare lo stesso
    Avrò mica trovato un bug del .Net Franmework 1.1?
    Svegliati, Neo. Matrix ti possiede...

  4. #4
    Utente di HTML.it L'avatar di hkproj
    Registrato dal
    Jul 2006
    Messaggi
    250
    Avrò mica trovato un bug del .Net Franmework 1.1?
    non credo... perchè tantissime volte la gente fa questo tipo di cosa...
    e cmq se veramente cè il bug allora dovresti aggiornare il .NET Framework alla 2.0
    --------------------HkProj------------------

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da newbie
    Nonostante MSDN dica il contrario, l'odiosissima MessageBox appare lo stesso
    Avrò mica trovato un bug del .Net Franmework 1.1?
    Se non posti mai una riga di codice......
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it L'avatar di newbie
    Registrato dal
    Dec 2005
    Messaggi
    299
    Originariamente inviato da alka
    Se non posti mai una riga di codice......
    Le riche incriminate sono 5... eppure non capisco dove sia l'inghippo
    codice:
        Private Sub testo_codice_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles testo_codice.Validating
            If testo_codice.Text.Length = 0 Then
                MessageBox.Show("Inserire un codice")
                e.Cancel = True 'rifiuta il valore
            End If
        End Sub
    
        Private Sub FinestraInput_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
            e.Cancel = False 'secondo MSDN, non dovrebbe generare Validating
        End Sub
    in cui la casella di testo testo_codice ha CausesValidation = true.
    Neanche creando un tasto Chiudi, con CausesValidation = False, che nell'evento Click ha *solo* la riga Me.Close(), il problema si risolve. Succede la stessa cosa se creo un form con la sola casella di testo...
    Svegliati, Neo. Matrix ti possiede...

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Utente di HTML.it L'avatar di newbie
    Registrato dal
    Dec 2005
    Messaggi
    299
    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).
    Svegliati, Neo. Matrix ti possiede...

  9. #9
    Utente di HTML.it L'avatar di newbie
    Registrato dal
    Dec 2005
    Messaggi
    299
    La bastardata dell'ErrorProvider funziona a dovere: l'evento di convalida viene generato, i dati sono convalidati come errati, ma la finestra si chiude senza fare in tempo a mostrare l'errore...

    GENIALE!
    Svegliati, Neo. Matrix ti possiede...

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Ho perso il filo conduttore della discussione.

    Il compito di Error Provider e meccanismi di validazione correlati, a quanto mi risulta, è quello di aggregare la logica di validazione e fornire strumenti per segnalare eventuali errori all'utente.

    Tuttavia, è compito dello sviluppatore usare questi strumenti per verificare se la validazione è andata a buon fine e, in caso contrario, se la finestra non deve essere chiusa, evitare appunto di chiuderla con Close.

    Non è un compito che spetta ai suddetti controlli e meccanismi di validazione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.