Chiudere form su validazione controllo

martedì 06 gennaio 2009 - 15.29

Teech Profilo | Expert

Ho un form con un TextBox che ho reso obbligatorio secondo delle regole di validazione (evento Validating).
Siccome vorrei poter chiudere il form anche se il valore del textbox non rispettasse le regole di validazione ho pensato di poter scrivere una stringa definita che indica la chiusura:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Funziona tutto correttamente se non fosse che scrivendo "chiudi" nella textbox non esegue la chiusura. Perchè?

Grazie
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

cenere Profilo | Senior Member

hai provato a cambiare l'evento e invee che farlo durante farlo dopo la validazione?
ciao

Teech Profilo | Expert

Ma se la validazione fallisce non viene generato l'evento successivo (e.Cancel=True): siccome è certo che la validazione fallirebbe (la stringa "chiudi" non rientra nei parametri di validazione) tutto ciò che viene dopo non viene eseguito.

Ho provato a chiudere l'applicazione invece del form (mettendo semplicemente 'End' al posto di 'Me.Close()') e l'applicazione si chiude correttamente.
In Debug vedo chiaramente che il flusso passa correttamente sul metodo Me.Close() ma non succede nulla.

Il problema è che questo Form verrà caricato su un PC in un ambiente di produzione (un'officina per intenderci) e mi è stato chiesto esplicitamente, vista la preparazione informatica degli utenti, che l'interazione con l'applicazione da parte degli utenti dovrà essere solamente attraverso un lettore codici a barre in emulazione di tastiera: per interagire utilizzo delle TextBox con comportamenti mirati (comportamenti dettati dalle validazioni) e uso delle stringhe "speciali" per alcuni comportamenti (come appunto la chiusura del form o l'emulazione di pressione di tasti) per non dover creare un hook di tastiera (che non saprei nemmeno da dove iniziare).
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

Ciao,
ma perchè non metti quel codice nel "TextChanged" della textBox, invece che nel Validating?
Facendo delle prove con questo codice non ho avuto nessun problema:

private void textBox_TextChanged(object sender, EventArgs e) { if (textBox.Text.ToLower() == "chiudi") this.Close(); }

a te non fa differenza, perchè se sparano la parola "chiudi" da una pistola ottica, o lo scrivono a mano nella textbox, l'evento scatta ad ogni tasto digitato o sparato dentro alla textbox.

A meno che non sia qualcos'altro il problema, però il validating lo userei solo per validare un input, ossia tipo che ti scrivono "." o "," e vuoi che faccia la stessa cosa, o che non sia più lungo ti tot, o che sia una stringa formattata come vuoi tu...cose di questo genere.

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Teech Profilo | Expert

[Con la lettura del codice a barre (creerò dei codici a barre specifici) alla fine viene mandato un INVIO (setterò la pistola perchè si comporti in quel modo): questo INVIO mi porta nell'evento Validating in quanto nell'evento KeyDown della TextBox ho questa indicazione:
TextBox.Parent.SelectNextControl(TextBox, True, True, True, True)
Nella validating controllo che il contenuto della textbox sia un codice valido rispetto ai dati presenti sul DB e se il codice è valido faccio delle operazioni in base al valore della textbox (in una scrivo la descrizione relativa al codice in una Label, in un altra istanzio un oggetto e lo aggiungo ad una collection). Dici che esagero con le operazioni nella validazione? Se esagero, quali altri eventi dovrei utilizzare secondo te?

L'unica remora ad utilizzare il TextChange è che digitando l'ultima "i" della parola "chiudi" il form si chiude senza considerare l'INVIO...
Proverò comunque per vedere se l'INVIO dopo la lettura si perde o se viene riportato dopo l'operazione di chiusura (non so se mi sono spiegato).
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

>Dici che esagero con le operazioni nella validazione? Se esagero,
>quali altri eventi dovrei utilizzare secondo te?
mah il mio è una questione di "concetto" tendo a fare operazioni più relative al formato del testo nel validating, anche perchè Validating viene prima ancora del "validated" che è invece sucessivo, puoi vedere se quest'ultimo ti cambia qualcosa.


>L'unica remora ad utilizzare il TextChange è che digitando l'ultima
>"i" della parola "chiudi" il form si chiude senza considerare
>l'INVIO...
si chiaro, conosco la problematica, puoi sempre intercettare allora il KeyDown, e controllare che sia un "Keys.Enter" eventualmente

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

Teech Profilo | Expert

Ho provato mettendo il Me.Close() sugli eventi Validating, Validate, LostFocus ma sempre senza risultati positivi.
Ho provato con variabili Boolean utilizzate come flag, ho provato a variare la proprietà CausesValidation e cambiare l'ordine dei controlli nelle varie If e ad utilizzare delle Select... Sempre senza risultati utili. La soluzione era banale e logicamente la più corretta: usare l'evento Leave.

Nell'evento Leave devono ancora partire tutti i controlli di validazione che non mi servono se stò chiudendo il form, non salvo i dati. Se la stringa nel controllo non è "chiudi" opera normalmente. Nel modo più semplice possibile:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ho accettato la risposta perchè ritengo molto corretto e mi sono accorto essere anche importante la differenziazione fra l'evento Validating e Validated: ho applicato il concetto di "spezzare" i 2 momenti di elaborazione e mi sono accorto che il codice, oltre ad essere molto più pulito è anche meglio organizzato.

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

freeteo Profilo | Guru

>controlli nelle varie If e ad utilizzare delle Select... Sempre
>senza risultati utili. La soluzione era banale e logicamente
>la più corretta: usare l'evento Leave.
Effettivamente quegli eventi vengono gestiti da Windows in maniera diversa, nel senso che probabilmente non permette alcune operazioni sull'oggetto stesso (con il close della form di fatto lo distruggi) etc...



>Validating e Validated: ho applicato il concetto di "spezzare"
>i 2 momenti di elaborazione e mi sono accorto che il codice,
>oltre ad essere molto più pulito è anche meglio organizzato.
ok

Ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5