2014-09-23 6 views
5

Ho un modulo con i controlli di tabulazione nidificati. Stiamo provando a rendere l'applicazione adattabile alla tastiera, quindi quando accedi al controllo struttura a schede interno, vorremmo che Control-Tab passasse in rassegna le schede interne. Per la maggior parte questo funziona. Partendo qui con la messa a fuoco in TextBox A ....Windows Forms, Nested TabControls con la scheda Groupbox order mystery (w/Illustrations)

enter image description here

Scheda Controllo ci porterà alla scheda successiva come previsto, con la messa a fuoco in TextBox B:

enter image description here

Fantastic , proprio quello che volevamo. Se "Gamma" e "Delta" sono simili, torno indietro di nuovo su Alpha con Control-Tab.

Tuttavia, abbiamo alcune schede in cui tutti i controlli si trovano all'interno delle caselle di gruppo. Questo causa tutti i tipi di problemi. Se prendo lo stesso esempio, ma inserisco la casella di testo all'interno di una casella di gruppo. Partendo qui con la messa a fuoco nel TextBox A ancora:

enter image description here

Control-scheda ci porta alla scheda successiva, come ci si aspetterebbe. (Curiosamente, la messa a fuoco non è da nessuna parte visibile ...)

enter image description here

Ma poi Control-scheda ci porta di nuovo per ...

enter image description here

Speculazione: Questo perché la la tabulazione da Alfa (con le groupbox) a Beta (con le groupbox) lasciava Beta senza controllo con focus. Lo stato attivo tornava al controllo struttura a schede (AlphaBetaGammaDelta) e Control-Tab veniva passato al controllo scheda esterno (OneTwoThreeFour).

Ora, posso risolvere questo catturando l'evento SelectedIndexChanged per il controllo scheda interna, e messa a fuoco manuale il primo controllo della messa a fuoco in grado all'interno di quella scheda ogni volta che cambia, ma che sembra così sbagliato e un mal di testa di manutenzione, se i controlli vengono spostati.

// Works, but I'm not crazy about it. 
    private void tabControlABGD_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     switch(tabControlABGD.SelectedTab.Name) 
     { 
      case "tp_A": 
       tb_a.Focus(); 
       break; 
      case "tp_B": 
       tb_b.Focus(); 
       break; 
      case "tp_G": 
       tb_g.Focus(); 
       break; 
      case "tp_D": 
       tb_d.Focus(); 
       break; 
     } 
    } 

Messing con "ordine di tabulazione" del modulo - nessun effetto di sorta.

Qual è il modo giusto per risolvere il problema?

+2

I <3 Balsamiq troppo :) – ne1410s

+0

Solo l'istruzione switch è sbagliato: basta selezionare il primo controllo indicizzato nel contenitore focalizzato. –

risposta

1

Invece di un interruttore, provo a chiamare semplicemente il metodo SelectNextControl:

void tabControlABGD_SelectedIndexChanged(object sender, EventArgs e) { 
    this.SelectNextControl(tabControlABGD, true, true, true, true); 
}