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

16

我无法在选项卡页首次出现时将输入焦点放在文本框上(我使用的是Windows窗体,VB.NET 3.5)。

我在选项卡页上有一个面板中的文本框,并且当选项卡页出现时,我希望焦点在文本框上。我希望用户能够立即在聚焦的文本框中开始键入,而不必单击该文本框。我已经按照所需顺序设置了制表位,并且文本框是第一个制表位。制表符有效,只是当选项卡页面出现时,焦点没有在文本框上,也就是说,不在制表顺序中的第一个文本框上。

在选项卡页的“Enter”事件处理程序中,我调用文本框的“Focus”方法,但返回False并且什么都没有发生,没有错误消息。 我知道我可以访问该文本框,因为在代码的相同点上,我可以设置文本框的文本。

如果有影响,选项卡页的布局有点复杂:

frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1

我想将焦点设置在TextBox1上。

  1. 如何最好地使所需文本框获得焦点?
  2. 如果设置焦点是最佳方法,为什么textbox.Focus()方法失败了?
9个回答

29

我猜你正在尝试在表单加载事件处理程序中设置焦点?如果是这样,你需要执行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

如果要选择选项卡控件上的文本框作为第一个选定的字段,则仍需在加载事件中设置初始焦点,如上所示。


我正在尝试在选项卡页的Enter事件中设置焦点,认为Enter事件对于选项卡页来说就像Load事件对于表单一样,即它是初始化事物的地方。 - RaleighBoy
你想要处理 _SelectedIndexChanged 事件: - Robert Beaubien
1
是的,在TabControl1_SelectedIndexChanged事件处理程序中设置焦点解决了问题。感谢您的帮助。 - RaleighBoy
3
您可以在Me.Shown的处理程序中完成此操作。 - Hannele

11

尝试以下两种方法之一:

Me.ActiveControl = TextBox1
或者
TextBox1.Select()

当我执行第一个操作时,界面上没有任何效果;当我在调试器中查询Me.ActiveControl时,它列出了TextBox1,所以我猜测TextBox1是活动控件,但它并没有将光标放在文本框中。 - RaleighBoy
当我执行第二个操作(TextBox1.Select(0,0)),什么也没有发生。 - RaleighBoy
抱歉,请尝试使用TextBox1.Select() - keyboardP
TextBox1.Select()也没有效果。我忘记了我在应用程序的其他地方使用.Select()来设置文本框的焦点,它可以正常工作。我猜这个特定的情况可能是有些东西阻止了这个文本框获取焦点。 - RaleighBoy

4

OnShown 事件中使用 control.Focus()。你不需要任何无用的 DoEvents 逻辑,它并没有为我工作。


1
你应该使用 TabControlSelected 事件。
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

我已经检查了TabControl.SelectedTabPage.Enter事件,都可以设置选择TextBox。我认为可能有其他元素正在抢占焦点,请验证一下。


1
我通过在TabControl1.SelectedIndexChanged事件处理程序中设置焦点来解决了这个问题。谢谢你的帮助。 - RaleighBoy

1

我在网上找到的任何解决方案都不能解决控件位于选项卡页面上时的问题。

然而,这个方法有效:

(1) 将控件的 TabIndex 设置为 0。

(2) 在处理选项卡事件的代码中,执行以下操作:

SendKeys.Send("{TAB}")

如果SendKeys似乎不是有效的语句,请确保您在代码文件顶部具有以下导入:
Imports System.Windows.Forms

0
我发现当Selected事件完成时,TabControl会获得焦点。为了使其工作,我使用了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

0

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


0
尝试像这样使用表单的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

这是保证可行的。


0

你想试试这些吗?

            Me.Activate()
            TextBox1.Focus()
            TextBox1.SelectAll()

更多的信息会提高这个答案。 - mydoglixu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接