繁体   English   中英

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

[英]Can't set focus on a Windows Forms textbox

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

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

在标签页的 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

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

尝试:

Me.ActiveControl = TextBox1

或者

TextBox1.Select()

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

您应该使用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事件可以设置 Select TextBox 我认为还有其他一些元素在窃取焦点。 请核实

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

但是,这有效:

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

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

SendKeys.Send("{TAB}")

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

Imports System.Windows.Forms

我发现当 Selected 事件完成时 TabControl 获得焦点。 为了完成这项工作,我使用 TabPage 的 Paint 事件来设置所需 object 的焦点。

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() function 解决了它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM