none
Aggiunta di un evento alla pressione di TAB o Shift+Tab RRS feed

  • Domanda

  • Buon Giorno a tutti.

    Come posso modificare il normale funzionamento dei tasti tab e shift+tab in una windows form?

    Spiego la mia necessità.

    In una Form con Tab passo al campo successivo (in base al TabIndex) e questo mi va bene tranne che in alcuni casi.

    1. Se mi trovo sull'ultimo control e premo Tab non voglio che il cursore si posizioni sul primo campo ma esegua un altro pezzo di codice
    2. Se mi trovo sul 1° campo e premo shift+Tab non voglio che il cursore si posizioni sull'ultimo campo ma deve restare fermo sul primo campo

    Ovviamente ho a disposizione in una variabile il numero del tabIndex relativo all'ultimo campo disponibile e la parte del controllo non mi occorre. Vorrei solo sapere se è possibile intercettare questi due tasti e fare i miei controlli o ancora meglio farli nel metodo che consente di spostarsi al controllo successivo o precedente (visto che, nel mio progetto,  anche il tasto enter viene usato allo stesso modo del tab)

    Qualche idea?

    Grazie in anticipo

    venerdì 21 marzo 2014 14:08

Risposte

  • Ciao Softmerlino,

    Buon Giorno a tutti.

    Come posso modificare il normale funzionamento dei tasti tab e shift+tab in una windows form?

    Spiego la mia necessità.

    In una Form con Tab passo al campo successivo (in base al TabIndex) e questo mi va bene tranne che in alcuni casi.

    1. Se mi trovo sull'ultimo control e premo Tab non voglio che il cursore si posizioni sul primo campo ma esegua un altro pezzo di codice
    2. Se mi trovo sul 1° campo e premo shift+Tab non voglio che il cursore si posizioni sull'ultimo campo ma deve restare fermo sul primo campo

    Ovviamente ho a disposizione in una variabile il numero del tabIndex relativo all'ultimo campo disponibile e la parte del controllo non mi occorre. Vorrei solo sapere se è possibile intercettare questi due tasti e fare i miei controlli o ancora meglio farli nel metodo che consente di spostarsi al controllo successivo o precedente (visto che, nel mio progetto,  anche il tasto enter viene usato allo stesso modo del tab)

    Qualche idea?

    Grazie in anticipo

    per intercettare una sequenza di tasti puoi dare un occhiata a questo thread , una volta riuscito ad intercettare puoi gestire nel modo che ti occorre la parte/i di codice interessate.

    Ciao.


    • Proposto come risposta Irina Turcu martedì 1 aprile 2014 11:34
    • Contrassegnato come risposta Irina Turcu giovedì 24 aprile 2014 12:29
    venerdì 21 marzo 2014 17:57
  • Poiché a te non serve solo intercettare la pressione del tasto TAB, ma modificare il comportamento dell'applicazione in base "a dove" lo premi, devi effettuare l'override del metodo ProcessCmdKey, http://msdn.microsoft.com/it-it/library/system.windows.forms.form.processcmdkey(v=vs.110).aspx, e quindi controllare qual è il tasto premuto, analizzando il suo argomento keyData.

    Se è stato premuto il tasto TAB oppure SHIFT+TAB, devi richiamare il metodo SelectNextControl, http://msdn.microsoft.com/it-it/library/system.windows.forms.control.selectnextcontrol(v=vs.110).aspx, passandogli gli opportuni parametri per selezionare il controllo precedente o quello seguente (in base ai tasti premuti).

    Nel tuo caso, poiché ti serve sapere se stai cercando di andare "indietro" quando ti trovi sul primo controllo, oppure "avanti" se sei sull'ultima, è importante che l'ultimo parametro del metodo SelectNextControl sia impostato su false, così da non "ripartire daccapo" alla fine della giro di tabulazione. Questo serve perché il metodo SelectNextControl restituisce un booleano che dice se è riuscito ad attivare un nuovo controllo: quindi, se ti dà false, significa che non ha spostato il focus, perché già si trovava sul primo o sull'ultimo controllo.

    In conclusione, verificando il valore di ritorno del metodo, puoi sapere "dove ti trovi" quando vengono premuti i tasti, e quindi agire di conseguenza.


    Marco Minerva - MVP Visual C#
    Blog: http://marcominerva.wordpress.com
    Twitter: @marcominerva

    • Proposto come risposta Irina Turcu martedì 1 aprile 2014 11:34
    • Contrassegnato come risposta Irina Turcu giovedì 24 aprile 2014 12:29
    lunedì 24 marzo 2014 11:20
    Moderatore

Tutte le risposte

  • Ciao Softmerlino,

    Buon Giorno a tutti.

    Come posso modificare il normale funzionamento dei tasti tab e shift+tab in una windows form?

    Spiego la mia necessità.

    In una Form con Tab passo al campo successivo (in base al TabIndex) e questo mi va bene tranne che in alcuni casi.

    1. Se mi trovo sull'ultimo control e premo Tab non voglio che il cursore si posizioni sul primo campo ma esegua un altro pezzo di codice
    2. Se mi trovo sul 1° campo e premo shift+Tab non voglio che il cursore si posizioni sull'ultimo campo ma deve restare fermo sul primo campo

    Ovviamente ho a disposizione in una variabile il numero del tabIndex relativo all'ultimo campo disponibile e la parte del controllo non mi occorre. Vorrei solo sapere se è possibile intercettare questi due tasti e fare i miei controlli o ancora meglio farli nel metodo che consente di spostarsi al controllo successivo o precedente (visto che, nel mio progetto,  anche il tasto enter viene usato allo stesso modo del tab)

    Qualche idea?

    Grazie in anticipo

    per intercettare una sequenza di tasti puoi dare un occhiata a questo thread , una volta riuscito ad intercettare puoi gestire nel modo che ti occorre la parte/i di codice interessate.

    Ciao.


    • Proposto come risposta Irina Turcu martedì 1 aprile 2014 11:34
    • Contrassegnato come risposta Irina Turcu giovedì 24 aprile 2014 12:29
    venerdì 21 marzo 2014 17:57
  • Poiché a te non serve solo intercettare la pressione del tasto TAB, ma modificare il comportamento dell'applicazione in base "a dove" lo premi, devi effettuare l'override del metodo ProcessCmdKey, http://msdn.microsoft.com/it-it/library/system.windows.forms.form.processcmdkey(v=vs.110).aspx, e quindi controllare qual è il tasto premuto, analizzando il suo argomento keyData.

    Se è stato premuto il tasto TAB oppure SHIFT+TAB, devi richiamare il metodo SelectNextControl, http://msdn.microsoft.com/it-it/library/system.windows.forms.control.selectnextcontrol(v=vs.110).aspx, passandogli gli opportuni parametri per selezionare il controllo precedente o quello seguente (in base ai tasti premuti).

    Nel tuo caso, poiché ti serve sapere se stai cercando di andare "indietro" quando ti trovi sul primo controllo, oppure "avanti" se sei sull'ultima, è importante che l'ultimo parametro del metodo SelectNextControl sia impostato su false, così da non "ripartire daccapo" alla fine della giro di tabulazione. Questo serve perché il metodo SelectNextControl restituisce un booleano che dice se è riuscito ad attivare un nuovo controllo: quindi, se ti dà false, significa che non ha spostato il focus, perché già si trovava sul primo o sull'ultimo controllo.

    In conclusione, verificando il valore di ritorno del metodo, puoi sapere "dove ti trovi" quando vengono premuti i tasti, e quindi agire di conseguenza.


    Marco Minerva - MVP Visual C#
    Blog: http://marcominerva.wordpress.com
    Twitter: @marcominerva

    • Proposto come risposta Irina Turcu martedì 1 aprile 2014 11:34
    • Contrassegnato come risposta Irina Turcu giovedì 24 aprile 2014 12:29
    lunedì 24 marzo 2014 11:20
    Moderatore
  • Grazie Carmelo e grazie Marco.

    ho provato una cosa del genere

    		protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    	    {
    			if (keyData == Keys.Tab)
    			{
    				SelectNextControl(this.ActiveControl, true, true, true, false);
    			}
    			if (keyData == Keys.Enter)
    			{
    				SelectNextControl(this.ActiveControl, true, true, true, false);
    			}			
    			return base.ProcessCmdKey(ref msg, keyData);						
    		}
    

    ma se premo tab avanza di 2 campi con Enter uno solo.

    inoltre c'è modo di inserire questo override in una dll (es. quella che uso per ridisegnare tutte le mie form) così da non dover modificare tutti i programmi?

    Lo shift-tab invece come lo intercetto?

    ultima cosa se gestisco un Tab control vorrei che quando sono sull'ultimo campo del TabControl e premo tab o invio cambiasse tab e si posizionasse sul primo campo del tab successivo, e al contrario quando sono su un tab diverso dal primo e premo shift+tab vorrei che andasse sull'ultimo campo del tab precedente.

    Qualche idea?

    Grazie a tutti

    mercoledì 26 marzo 2014 14:14
  • ma se premo tab avanza di 2 campi con Enter uno solo.

    Perché devi dire al sistema che hai già gestito la pressione del tasto, e quindi non deve eseguire il comportamento predefinito. Per fare questo, dopo SelectNextControl, devi restituire il valore true.

    inoltre c'è modo di inserire questo override in una dll (es. quella che uso per ridisegnare tutte le mie form) così da non dover modificare tutti i programmi?

    Quello che puoi fare è inserire in una DLL form base in cui esegui l'override di ProcressCmdKey. Dovrai poi modificare tutte le tue form in modo che, invece che fa Form, ereditino dalla tua nuova classe base. 

    Lo shift-tab invece come lo intercetto?

    L'argomento keyData è un'enumerazione di tutti i tasti premuti:

    switch (keyData)
    {
        case Keys.Tab | Keys.Shift:
            // SHIFT + TAB;
            break;
            
        case Keys.Tab:
            // TAB;
            break;
            
         default:
            break;
    }

    ultima cosa se gestisco un Tab control vorrei che quando sono sull'ultimo campo del TabControl e premo tab o invio cambiasse tab e si posizionasse sul primo campo del tab successivo, e al contrario quando sono su un tab diverso dal primo e premo shift+tab vorrei che andasse sull'ultimo campo del tab precedente.

    Anche in questo caso ti serve giocare con l'evento ProcessCmdKey, che questa volta devi intercettare in un tuo controllo custom che eredita da TabControl, poiché solo così puoi accedere ad esso. Dai un'occhiata a questo post: http://stackoverflow.com/questions/7568499/autotab-to-next-tabpage-in-tabcontrol. Non risponde completamente alla tua domanda, ma dovrebbe fornirti quello che ti serve perché tu possa realizzare quello che ti serve.


    Marco Minerva - MVP Visual C#
    Blog: http://marcominerva.wordpress.com
    Twitter: @marcominerva

    mercoledì 26 marzo 2014 14:33
    Moderatore
  • Grazie Marco con qualche modifica che poi posterò per dovere di cronaca funziona tutto.

    Unica cosa (penso a causa del ovveride) quando mi sposto al control successivo con tab e il control successivo è un checkbox viene selezionata la descrizione del text box mentre se mi sposto con enter non viene selezionata, (per selezionata intendo un rettangolo tratteggiato che evidenzia la descrizione).

    Inoltre c'è un petodo per conoscere l'ultimo control di una PageTab? Altrimenti quando digito Shift+Tab si posiziona sul primo campo della PageTab precedente, mentre sarebbe più comodo l'ultimo campo della PageTab precedente....

    Grazie ancora e ciao


    giovedì 27 marzo 2014 09:33
  • Unica cosa (penso a causa del ovveride) quando mi sposto al control successivo con tab e il control successivo è un checkbox viene selezionata la descrizione del text box mentre se mi sposto con enter non viene selezionata, (per selezionata intendo un rettangolo tratteggiato che evidenzia la descrizione).

    Poiché sei tu che stai gestendo manualmente tutta la parte di spostamento del focus dei controlli, ti devi occupare anche di gestire i "casi particolari" come questo. Non è sicuramente una cosa banale, e quindi devi armarti di pazienza e fare un po' di prove, ad esempio lavorando con il controllo attivo ed eventualmente compiendo determinate operazioni a seconda del suo tipo.

    Inoltre c'è un petodo per conoscere l'ultimo control di una PageTab? Altrimenti quando digito Shift+Tab si posiziona sul primo campo della PageTab precedente, mentre sarebbe più comodo l'ultimo campo della PageTab precedente....

    Puoi iterare tra i controlli del TabPage per recuperare il controllo con TabIndex più alto.


    Marco Minerva - MVP Visual C#
    Blog: http://marcominerva.wordpress.com
    Twitter: @marcominerva

    venerdì 28 marzo 2014 11:26
    Moderatore