无法在Windows窗体文本框中设置焦点

无法在Windows窗体文本框中设置焦点

问题描述:

当标签页首次出现时(我正在使用Windows窗体,VB.NET 3.5),似乎无法在文本框中获得输入焦点。无法在Windows窗体文本框中设置焦点

我在选项卡页面上的面板上有一个文本框,我希望焦点在选项卡页面出现时位于文本框中。我希望用户能够在焦点文本框中立即开始输入,而无需点击文本框。我按照我想要的顺序设置了制表位,文本框是第一个制表位。该选项卡停止工作,只是当选项卡页面出现时,焦点不在文本框上,即按Tab键顺序排列的第一个。

在标签页的Enter事件处理程序中,我调用文本框的Focus方法,但它返回False并且什么也不做,没有错误消息。我知道我可以访问文本框,因为 在代码中的同一点我可以设置文本框的文本。

如果它的事项,该标签页面的布局有点复杂:

frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1 

我想设置重点TextBox1的。

  1. 什么是最好的方式来关注所需的文本框?
  2. 如果设置焦点是最好的方法,为什么textbox.Focus()方法失败?

我会假设你正试图将焦点设置在窗体加载事件处理程序?如果是这样,您需要执行Me.Show()才能在设置焦点之前实际创建屏幕控件。沿着线的东西:

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

如果你不这样做的Me.Show(),不显示的形式,直到负载事件完成。

对于标签控制,处理_SelectedIndexChanged事件:

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 

您仍希望设置在加载事件的初始焦点如上所示,如果选择了第一场是成为标签上的文本框控制。

+0

我试图在标签页的Enter事件中设置焦点,认为Enter事件是在标签页上的Load事件对窗体的作用,即它是您初始化事物的地方。 – RaleighBoy 2011-06-09 04:35:26

+0

您想要处理_SelectedIndexChanged事件: – 2011-06-09 04:57:23

+1

是的,在TabControl1_SelectedIndexChanged事件处理程序中设置焦点解决了问题。谢谢你的帮助。 – RaleighBoy 2011-06-09 16:21:32

尝试之一:

Me.ActiveControl = TextBox1 

TextBox1.Select() 
+0

当我做第一个时,我看不到UI的影响;当我在调试器中查询Me.ActiveControl时,它列出了TextBox1,所以我猜TextBox1是主动控件,但它不会将光标置于文本框中。 – RaleighBoy 2011-06-09 03:19:09

+0

当我做第二个(TextBox1.Select(0,0))时,没有任何反应。 – RaleighBoy 2011-06-09 03:20:38

+0

对不起,试试'TextBox1.Select()' – keyboardP 2011-06-09 03:20:55

正如我已经签入两个TabControl.SelectedTabPage.Enter事件可以设置选择TextBox你应该使用Selected事件的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 

。我认为还有一些其他元素偷窃焦点。请变更

+1

的处理程序中通过在TabControl1.SelectedIndexChanged事件处理程序中设置焦点来解决此问题。谢谢你的帮助。 – RaleighBoy 2011-06-09 16:22:41

我在网上找到的任何解决方案都无法解决控件位于标签页上时的问题。

然而,这种工作原理:

(1)设置的TabIndex控制的为0。

(2)在你的代码处理该标签页时,请执行下列操作:

SendKeys.Send("{TAB}") 

如果的SendKeys似乎并没有一个有效的statment,请确保您有以下进口在顶部您的代码文件:

Imports System.Windows.Forms 

执行control.Focus()OnShown事件。无论如何,您都不需要任何DoEvents逻辑,这些逻辑对我无效。

+0

太好了。这工作。 – Alex 2013-09-04 19:28:59

我发现TabControl在Selected事件完成时获得焦点。为了做到这一点,我使用了TabPage的Paint事件来设置所需对象的焦点。

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 

尝试Activated事件的形式是这样的:

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 

这是保证工作。

我曾经有同样的问题,但我解决了它使用Me.activate()函数。