Vb.net 在WinForms中,如何在运行时设置按钮的tabIndex?

Vb.net 在WinForms中,如何在运行时设置按钮的tabIndex?,vb.net,winforms,Vb.net,Winforms,我有一个通用消息框,其中有几个面板,我们在运行时在其中添加控件 在我的表单中,我已经有了pnlBottom,上面有pnlButtons以及一些其他控件 现在在运行时,我将添加一个OK按钮到pnlButtons,它位于pnlBottom上。我没有为Designer.vb文件中的任何控件设置TabIndex 我试图使用下面的代码将焦点放在OK按钮上,但它不起作用 For Each control As Control In Me.Controls If TypeOf (control) Is

我有一个通用消息框,其中有几个面板,我们在运行时在其中添加控件

在我的表单中,我已经有了
pnlBottom
,上面有
pnlButtons
以及一些其他控件

现在在运行时,我将添加一个
OK
按钮到
pnlButtons
,它位于
pnlBottom
上。我没有为
Designer.vb
文件中的任何控件设置
TabIndex

我试图使用下面的代码将焦点放在
OK
按钮上,但它不起作用

For Each control As Control In Me.Controls
    If TypeOf (control) Is Panel Then
        Dim pnlBottons As Panel = CType(control, Panel)
        If pnlBottons.Name = "pnlBottom" Then
            For Each ctrl As Control In control.Controls
                Dim pnlButtons As Panel = CType(ctrl, Panel)
                If pnlButtons.Name = "pnlButtons" Then
                    For Each ctrlbtn As Control In ctrl.Controls
                        If TypeOf (ctrlbtn) Is Button Then
                            Dim textBox As Button = CType(ctrlbtn, Button)
                            textBox.Parent.Parent.TabIndex = 0
                            textBox.Parent.TabIndex = 0
                            textBox.TabIndex = 0
                        End If
                    Next
                End If
            Next
        End If
    End If
Next
在这里,我将
pnlBottom
pnlButtons
OK
按钮的选项卡索引设置为0

请建议如何对焦
OK
按钮。

您可以使用以下方法之一:

1-控制。选择方法

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Mybase.Load
    Me.OKButton.Select()
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Mybase.Load
    Me.Show()
    Me.OKButton.Focus()
End Sub
Focus是一种低级方法,主要用于自定义控件 作者。相反,应用程序程序员应该使用Select方法 或子控件的ActiveControl属性,或激活 用于表单的方法


2-Form.ActiveControl属性

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Mybase.Load
    Me.ActiveControl = Me.OKButton
End Sub

3-控制聚焦方法

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Mybase.Load
    Me.OKButton.Select()
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Mybase.Load
    Me.Show()
    Me.OKButton.Focus()
End Sub
我们调用Me.Show()的原因是将表单可见设置为true。根据:

可以在窗体的加载事件中使用Control.Focus方法 仅在窗体的Visible属性之后设置控件的焦点 设置为True


如果您不能使用
Me.ok按钮
您可以找到如下所示的控件:

Dim control = Me.Controls.Find("OKButton", True).FirstOrDefault()
If Not control Is Nothing Then
    control.Select() 'or other stuff
End If

如果textBox.Text=“确定”,那么textBox.Focus()
?(没有这些父项和TabIndex)这不是TabIndex应该如何工作的。TabIndex确定通过tab键访问控件的顺序(从最低索引到最高索引,无特定的第一个/最后一个索引)。要在运行时将焦点设置在特定控件上,可以使用focus()方法,正如前面的注释所建议的那样。我为StackOverflow制作了一个小工具,可以轻松地将代码缩进增加或减少4个空格。要使用它,textBox.Focus()在运行时没有在我的按钮控件上设置焦点。所以我想我可以使用tab索引o(零)来显示focus on OK按钮,但它不工作。什么控件有focus?