Problemino textbox

venerdì 17 ottobre 2008 - 15.34

Sig. Travis Profilo | Junior Member

Ciao ragazzi, ho inserito nel mio progetto winform un textbox che può essere utilizzato come campo di input, nel caso l'utente decida di utilizzarlo in quel modo, sia come campo di output nel caso l'utente decida di utilizzare una dialog.
Quando utilizza il textbox la form sembra non percepire che il controllo si trovi sul textbox anche se il focus è su di esso e così in debug non si ferma sul breakpoint che inserisco alla prima riga di codice impostata per il controllo e così anche quando dò invio dopo aver effettuato la digitazione.
Come faccio per ottenere l'effetto di farlo fermare sul controlloo per eseguire le relative righe di codice? Si tratta di qualche proprietà da impostare?

Grazie mille,
Ciao\G

aiedail92 Profilo | Expert

Ciao

Non è molto chiaro quello che devi fare... Devi eseguire del codice quando l'utente digita qualcosa, oppure quando la TextBox perde il focus o quando lo acquista, oppure qualcos'altro ancora?

Luca

Sig. Travis Profilo | Junior Member

Il controllo deve accettare il nome di un file, quindi una stringa abbastanza lunga. Come termina la digitazione visto che non accetta come buono l'invio e quindi non passa per il controllo che inserisco nel codice apposito? Devo poter eseguire in controllo di esistenza del file, poi quando accade non è un problema, cioè va bene anche quando perde il focus.

Grazie,
Ciao\G

aiedail92 Profilo | Expert

Se non sbaglio programmi in Cobol, giusto? Non conosco la sintassi del cobol, comunque il procedimento da seguire è questo: gestisci l'evento Validating della TextBox e nel codice del gestore controlli l'esistenza del file. A questo punto se il file esiste lasci che il controllo possa perdere il focus, mentre se il file non esiste puoi forzare il controllo a mantenere il focus impostando la proprietà Cancel di e (parametro del gestore eventi di tipo CancelEventArgs) su True. In questo modo il controllo mantiene il focus finchè non viene inserito un nome di file valido.

Ti faccio un esempio in C# sperando che possa aiutarti:

//Gestisce l'evento Validating della textbox, evento che viene //generato durante la convalida del controllo private void tuaTextBox_Validating(object sender, CancelEventArgs e) { //Ottiene il testo della textbox string inputFile = tuaTextBox.Text; //Controlla l'esistenza del file if (!File.Exists(inputFile)) { //Se il file non esiste imposta la proprietà Cancel di e su true e.Cancel = true; } //Se invece il file esiste lascia tutto com'è }

Luca

Sig. Travis Profilo | Junior Member

Grazie Luca, il codice è già scritto, è semplice, ora il problema è che come scrivo un carattere mi parte il controllo. Cosa posso impostare per dirgli di aspettare la digitazione completa(quindi dovrebbe aspettare l'invio)?



Ciao\G

aiedail92 Profilo | Expert

Sicuro di aver gestito l'evento Validating? In teoria dovrebbe essere eseguito solamente quando il controllo sta per perdere il focus oppure quando viene premuto un tasto di accettazione.

Luca

Sig. Travis Profilo | Junior Member

Allora, per default attiva la proprietà text_changed nella quale io ho inserito il codice che mi serve; a questo punto ho attivato anche per la proprietà validating lo stesso codice, nel senso che lo rimando al metodo textBox_textchanged.

Il problema è che è proprio questo metodo che se abilitato mi consente di scrivere un byte alla volta. Perchè parte per default?

Grazie ancora,
Ciao\G

aiedail92 Profilo | Expert

Probabilmente hai fatto un doppio click dal designer sulla TextBox, ciò genera automaticamente la funzione per la gestione dell'evento TextChanged. Quest'evento viene sollevato ogni volta che il testo della TextBox viene modificato, con la conseguenza che ogni volta che immetti un carattere viene eseguito il controllo.

Per risolvere puoi eliminare il metodo textBox_textchanged e lasciare solo textBox_Validating, ed inserire il codice direttamente lì, così viene eseguito solo durante la convalida.

Se dopo aver rimosso la funzione ti dà problemi di compilazione (definizione di metodo mancante) fai doppio click sull'errore e cancella la riga del codice, l'errore potrebbe essere causato dal fatto che è rimasto il codice di assegnazione dell'evento TextChanged mentre è stato rimosso il suo gestore.

Luca

Sig. Travis Profilo | Junior Member

Hey Luca, purtroppo ancora niente; ho seguito alla lettera le tue istruzioni ma il risultato ancora non è quello sperato.

Provo a vedere se me lo attiva con le proprietà Enter o Leave?

Ti dirò di più: con la proprietà Enter passa per il controllo prima ancora di accettare un input; con la proprietà Leave rimane imperturbabile come con la proprietà Validating e la prprietà Validated.
Eccheccazz........................

Grazie ancora,
Ciao\G

aiedail92 Profilo | Expert

Che cosa succede adesso, non viene proprio eseguito il codice? Se è così forse hai scordato l'istruzione che associa l'evento al gestore. E quindi se è così puoi associare l'evento dal designer: clicki sulla TextBox, quindi sul pulsante Eventi della finestra delle proprietà (quello col fulmine), poi cerchi Validating e dopo aver clickato sulla freccia a destra scegli la funzione che deve gestire l'evento.

Se invece non è quello il problema, a te la parola

Luca

Sig. Travis Profilo | Junior Member

Ascolta Luca io nella form ho il textbox ed un datagridview che viene riempito successivamente ma su cui non va il focus. Per riempire il datagridview a seguito della selezione del file, utilizzo una scelta da menustrip.

Non è che Leave non funziona perchè non c'è un reale controllo successivo al textbox? Il datagridview fino al suo riempimento è in stato hide.

Grazie,
Ciao\G

aiedail92 Profilo | Expert

Ecco svelato l'arcano

In pratica gli elementi dei menu vengono gestiti in modo differente dagli altri controlli, e non causano la perdita del focus per il controllo attivo. Comunque puoi inserire il codice per verificare la validità del file direttamente all'interno del gestore dell'evento Click del ToolStripMenuItem, in caso il file esista esegui il lavoro che devi fare, mentre se non esiste puoi, ad esempio, mostrare una MessageBox di errore oppure impostare il colore di sfondo della TextBox su rosso o ancora usare un controllo ErrorProvider per segnalare l'errore.

Luca

Sig. Travis Profilo | Junior Member

E mi sa tanto che farò così; a questo punto è l'unica soluzione, non vale la pena perdere così tanto tempo su una cosa del genere.......

Buona serata,
Ciao\G
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5