【问题标题】:Can't set focus on a Windows Forms textbox无法在 Windows 窗体文本框上设置焦点
【发布时间】:2011-09-11 08:53:13
【问题描述】:

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

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

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

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

frmFoo/TabControl1/TabPageX/Panel1/Panel2/TextBox1

我想将焦点设置在 TextBox1 上。

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

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      尝试如下形式的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
      

      这保证有效。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            我在网上找到的任何解决方案都不能解决控件在标签页上时的问题。

            但是,这是可行的:

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

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

            SendKeys.Send("{TAB}")
            

            如果 SendKeys 似乎不是一个有效的语句,请确保您的代码文件顶部有以下导入:

            Imports System.Windows.Forms
            

            【讨论】:

              【解决方案6】:

              我会假设您正在尝试在表单加载事件处理程序中设置焦点?如果是这样,您需要在设置焦点之前执行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(),则在加载事件完成之前不会显示表单。

              对于tab控件,处理_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 事件对于表单一样,即它是您初始化事物的地方。
              • 你要处理 _SelectedIndexChanged 事件:
              • 是的,在 TabControl1_SelectedIndexChanged 事件处理程序中设置焦点解决了这个问题。感谢您的帮助。
              • 您也可以在 Me.Shown 的处理程序中执行此操作
              【解决方案7】:

              你应该使用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。我认为还有其他一些元素在窃取焦点。请修改

              【讨论】:

              • 我通过在 TabControl1.SelectedIndexChanged 事件处理程序中设置焦点解决了这个问题。感谢您的帮助。
              【解决方案8】:

              试试:

              Me.ActiveControl = TextBox1
              

              TextBox1.Select()
              

              【讨论】:

              • 当我做第一个时,我看不到对 UI 的影响;当我在调试器中查询 Me.ActiveControl 时,它列出了 TextBox1,所以我猜 TextBox1 是活动控件,但它没有将光标放在文本框中。
              • 当我做第二个 (TextBox1.Select(0,0)) 时,什么也没有发生。
              • 抱歉,试试TextBox1.Select()
              • TextBox1.Select() 也没有效果。我忘记了我在我的应用程序中使用 .Select() 其他地方来设置文本框的焦点,它工作正常。我想这种特殊情况有一些东西阻止了这个文本框获得焦点。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-11-10
              • 2010-09-11
              • 1970-01-01
              相关资源
              最近更新 更多