2010-10-28 38 views
5

El uso de TabControl.SelectTab("...") muestra la pestaña, pero también le da el foco a la pestaña. Me gustaría mostrar una pestaña en particular, pero mantener el foco donde está.Seleccionar página de pestaña en TabControl sin robar el foco

Tengo filas de datos en una cuadrícula. En función de las propiedades de la fila seleccionada, muestro una página de pestaña diferente para tener un diseño de interfaz de usuario diferente. Pero cuando se utilizan las teclas de flecha para desplazarse por las filas, el enfoque cambia a la pestaña seleccionada, lo que no quiero que ocurra.

Gracias.

Respuesta

3

No creo que hay una función incorporada, pero se puede hacer de esta manera:

private bool skipSelectionChanged = false; 

private void dataGridView_SelectionChanged(object sender, EventArgs e) 
{ 
    if (skipSelectionChanged) 
     return; 

    // supposing we decide tab[0] has to be selected... 
    this.SelectTabWithoutFocus(this.tabControl1.TabPages[0]); 
} 

private void SelectTabWithoutFocus(TabPage tabPage) 
{ 
    this.skipSelectionChanged = true; 

    // "this" is the form in my case, so you get the current focused control 
    // (ActiveControl), backup it, and re-set it after Tab activation 

    var prevFocusedControl = this.ActiveControl; 
    if (this.ActiveControl != null) 
    { 
     this.tabControl1.SelectedTab = tabPage; 
     prevFocusedControl.Focus(); 
    } 
    this.skipSelectionChanged = false; 
} 

Aquí, copia de seguridad del control de foco actual, seleccione la ficha deseada y, finalmente, establecer el foco al control original.

La omisión de booleanos es necesaria, ya que al centrar la cuadrícula se desencadena el evento SelectionChanged de nuevo, lo que provoca un bucle infinito.

+0

Aunque no creo que esta sea una solución ideal, esta idea terminó funcionando mejor en mi aplicación. Gracias. – TheSean

+0

Me alegro de ser de ayuda :) – digEmAll

+0

No estoy seguro de si esta solución funcionará en todos los casos, consulte [esta pregunta] (http://stackoverflow.com/q/435433/806690). – tm1

14

Puede intentar deshabilitar TabControl antes de configurar la pestaña seleccionada y luego volver a habilitarla. Esto evitará que se enfoque. Probé esto en un control de pestañas con algunos controles y no vi ningún cambio visual, pero tendrás que probarlo en tu UI y ver si está bien para ti.

tabControl1.Enabled = false; 
tabControl1.SelectTab("tabPage4"); 
tabControl1.Enabled = true; 

Para estar seguro, usted podría poner la línea para volver a habilitar el TabControl en un bloque finally para asegurarse de que no se quede inhabilitado.

+0

+1 ¡Realmente inteligente! – digEmAll

+0

Esta es una buena idea y funciona correctamente, pero el rendimiento no es muy bueno para activar/desactivar el control. La razón es que cada una de las páginas de pestañas tiene muchos controles, por lo que cada una está deshabilitada/habilitada, lo que lleva mucho tiempo y no se ve muy bien en la interfaz de usuario. – TheSean

+0

@TheSean, no sé si hay otra manera de evitar que se enfoque. Considero que retirar el foco del control de pestañas después de que el usuario selecciona una nueva fila en la cuadrícula no funciona para usted. –

0

Esto selecciona las páginas con pestañas, manteniendo el foco en la parte superior, como se le preguntó aquí arriba:

  tc.TabPages[0].Enabled = false; 
      tc.SelectTab(0); 
      tc.TabPages[0].Enabled = true; 

tc es aquí mi ejemplo para la TabControl tipo (es decir, es mi tarjeta de registro, y tiene algunas "páginas con pestañas"). Esto funciona bien para mí. Mi propósito es recorrer estas páginas con las teclas izquierda y derecha (arrows) i. mi. cuando voy hacia delante (por Key.Right) y llegar a la última tabpage Quiero tener mi enfoque en [0] sin activar el DataGridView que tiene en esa página, y cuando voy hacia atrás (por Key.Left) y llegar a [0] quiero tener [tc.TabCount - 1] habilitado, que es el último. El código para este caso es:

  tc.TabPages[tc.TabCount - 1].Enabled = false; 
      tc.SelectTab(tc.TabCount - 1); 
      tc.TabPages[tc.TabCount - 1].Enabled = true; 

la pieza completa de código es:

private bool KeyTc(System.Windows.Forms.Keys keyData) 
    { 
     if (keyData == K.Left && tc.SelectedIndex == 0) 
     { 
      tc.TabPages[tc.TabCount - 1].Enabled = false; 
      tc.SelectTab(tc.TabCount - 1); 
      tc.TabPages[tc.TabCount - 1].Enabled = true; 
      return true; 
     } 
     else if (keyData == K.Right && tc.SelectedIndex == tc.TabCount - 1) 
     { 
      tc.TabPages[0].Enabled = false; 
      tc.SelectTab(0); 
      tc.TabPages[0].Enabled = true; 
      return true; 
     } 
     return false; 
    } 

Este bool KeyTc se devuelve a un caso en una sentencia switch para la evaluación clave en:

protected override bool ProcessCmdKey(ref Message keyMsg, Keys keyData) 
    { switch keyData { ... } } 
+0

¿No es esta en esencia la misma respuesta que @adrift? – MicroVirus

0

Base en la solución propuesta por "Jeff Ogata: puede intentar deshabilitar TabControl antes de configurar la pestaña seleccionada, luego volver a habilitarla. Esto evitará que tome el foco", aquí bel bajo mi solución:

tabMain.SelectedPageChanging += (s, e) => 
     { 
      tabMain.Enabled = false; 
     }; 

     tabMain.SelectedPageChanged += (s, e) => 
     { 
      tabMain.Enabled = true;     
     }; 

Nota: este código está utilizando DevExpress "DevExpress.XtraTab.XtraTabControl".

Cuestiones relacionadas