2011-06-09 20 views
13

Parece que no puedo enfocar la entrada en un cuadro de texto cuando aparece una página con pestañas (estoy usando Windows Forms, VB.NET 3.5).No se puede establecer el foco en un cuadro de texto de Windows Forms

Tengo un cuadro de texto en un panel en una página con pestañas, y quiero que el foco esté en el cuadro de texto cuando aparece la página de pestañas. Quiero que el usuario pueda comenzar a escribir de inmediato en el cuadro de texto enfocado sin tener que hacer clic en el cuadro de texto. Tengo tabulaciones detenidas en el orden que quiero y el cuadro de texto es la primera tabulación. La pestaña detiene el trabajo, excepto que cuando aparece la página de pestañas, el foco no está en el cuadro de texto, es decir, el que está primero en el orden de las pestañas.

En el controlador de eventos Enter de la página de pestañas llamo al método de Enfoque del cuadro de texto, pero devuelve False y no hace nada, no hay mensajes de error. Sé que puedo acceder al cuadro de texto porque en el mismo punto en el código que puedo establecer el texto del cuadro de texto.

si importa, el diseño de la etiqueta es un poco complicado:

frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1 

Quiero establecer el foco en TextBox1.

  1. ¿Cuál es la mejor manera de enfocarse en el cuadro de texto deseado?
  2. Si establecer el enfoque es la mejor manera, ¿por qué falla el método textbox.Focus()?

Respuesta

24

yo asumiría que está intentando establecer el foco en el controlador de eventos de carga del formulario? Si es así, debe hacer un Me.Show() para crear realmente los controles en pantalla antes de establecer el foco. Algo a lo largo de las líneas de:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Me.Show() 
    Application.DoEvents() 
    TextBox1.Focus() 
End Sub 

Si usted no hace el Me.Show(), la forma no se muestra hasta que el evento de carga está completa.

Para el control de ficha, manejar la _SelectedIndexChanged evento:

Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As System.EventArgs) _ 
    Handles TabControl1.SelectedIndexChanged 

    If TabControl1.SelectedTab.Name = "TabPage1" Then 
     TextBox2.Focus() 
    End If 
    If TabControl1.SelectedTab.Name = "TabPage2" Then 
     TextBox4.Focus() 
    End If 

Usted todavía tendrá que ajustar el foco inicial en el evento de carga como se muestra arriba si el primer campo seleccionado es ser el cuadro de texto en la ficha controlar.

+0

Estoy tratando de establecer el foco en el evento Enter de la página de pestañas pensando que el evento Enter es para una pestaña lo que el evento Load es para un formulario, es decir, es donde inicializa las cosas. – RaleighBoy

+0

Desea controlar el evento _SelectedIndexChanged: –

+1

Sí, estableciendo el foco en el controlador de eventos TabControl1_SelectedIndexChanged resolvió el problema. Gracias por tu ayuda. – RaleighBoy

11

Prueba cualquiera:

Me.ActiveControl = TextBox1 

o

TextBox1.Select() 
+0

Cuando hago el primero no veo ningún efecto en la interfaz de usuario; cuando consulto Me.ActiveControl en el depurador, enumera TextBox1, así que supongo que TextBox1 es el control activo pero no coloca el cursor en el cuadro de texto. – RaleighBoy

+0

Cuando hago el segundo (TextBox1.Select (0,0)), no pasa nada. – RaleighBoy

+0

Lo sentimos, intente 'TextBox1.Select()' – keyboardP

1

qué debería utilizar Selected caso de TabControl

Private Sub TabControl1_Selected(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlEventArgs) Handles TabControl1.Selected 
    If e.TabPage.Name = "TabPage1" Then 
     TextBox1.Select() 
    End If 
End Sub 

Como he verificar en ambas TabControl.Selected y TabPage.Enter evento puede configurar Seleccionar TextBox. Creo que hay otros elementos que roban el foco. por favor varify

+1

He resuelto el problema estableciendo el foco en el controlador de eventos TabControl1.SelectedIndexChanged. Gracias por tu ayuda. – RaleighBoy

1

Cualquiera de las soluciones que encontré en línea no resuelve el problema cuando el control está en una página de pestañas.

Sin embargo, esto funciona:

(1) Ajustar el TabIndex del control a 0.

(2) En el código que controla el evento TabPage, haga lo siguiente:

SendKeys.Send("{TAB}") 

Si SendKeys no parece ser un DECLARACIÓN válida, asegúrese de que tiene la siguiente importación en la parte superior de el archivo de código:

Imports System.Windows.Forms 
3

Do the control.Focus() en caso OnShown. No necesita ninguna de la lógica de DoEvents que de todos modos no funcionó para mí.

+0

Genial. Esto funcionó. – Alex

0

Encontré que el TabControl obtiene el foco cuando el evento seleccionado se completa. Para que esto funcione, utilicé el evento Paint de TabPage para establecer el foco del objeto deseado.

Private Sub TabChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tab1.Paint, Tab2.Paint, Tab3.Paint 

    Select Case sender.Name 
     Case "Tab1" 
      Textbox1.Focus() 
     Case "Tab2" 
      T3extbox2.Focus() 
     Case "Tab3" 
      Textbox3.Focus() 
    End Select 

End Sub 
0

Prueba el caso Activated de la forma como esto:

Private Sub Form2_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated 
    'SendKeys.Send("{TAB}") this line works too 
    TextBox1.Focus() 
End Sub 

que está garantizado para trabajar.

0

Una vez tuve el mismo problema pero lo resolví usando la función Me.activate().

Cuestiones relacionadas