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

时间:2011-06-09 02:52:33

标签: vb.net winforms

当标签页首次出现时,我似乎无法将输入焦点放在文本框上(我使用的是Windows Forms,VB.NET 3.5)。

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

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

如果重要,标签页的布局有点复杂:

frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1

我想将焦点放在TextBox1上。

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

8 个答案:

答案 0 :(得分:24)

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

如果选择的第一个字段是选项卡控件上的文本框,您仍然需要在load事件中设置初始焦点,如上所示。

答案 1 :(得分:11)

尝试:

Me.ActiveControl = TextBox1

TextBox1.Select()

答案 2 :(得分:3)

执行control.Focus()活动中的OnShown。你不需要任何对我不起作用的DoEvents逻辑。

答案 3 :(得分:1)

您应该使用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

由于我已选中TabControl.SelectedTabPage.Enter,因此可以设置选择TextBox。我认为还有其他一些因素可以引起人们的关注。请变种

答案 4 :(得分:1)

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

然而,这有效:

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

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

SendKeys.Send("{TAB}")

如果SendKeys似乎不是有效的声明,请确保在代码文件的顶部有以下导入:

Imports System.Windows.Forms

答案 5 :(得分:0)

我发现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

答案 6 :(得分: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

这保证可行。

答案 7 :(得分:0)

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