0

我有 10 个按钮,我想单击一个按钮,以便它更改焦点文本框的文本并切换到下一个文本框。我试过这个:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    TextBox1.Focus()
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If TextBox1.Focus Then
        TextBox1.Text = "1"
        TextBox1.Enabled = False
        TextBox2.Focus()
        TextBox2.Enabled = True
    End If
    If TextBox2.Focus Then
        TextBox2.Text = "1"
        TextBox2.Enabled = False
        TextBox3.Focus()
        TextBox3.Enabled = True
    End If
    If TextBox3.Focus Then
        TextBox3.Text = "1"
        TextBox3.Enebled= False
        TextBox4.Focus()
        TextBox4.Enabled = True
    End If
End Sub

但它会在每个文本框中写入值,而不是仅仅进入下一个文本框

4

2 回答 2

0

在您的Click事件处理程序中,您依次调用Focuseach 的方法,TextBox然后在成功时填充它们。它每次都会成功,所以你填充每个TextBox.

我怀疑你的意思是测试Focused属性而不是调用Focus方法。这会更有意义,因为那样它只会填充TextBox有焦点的那个。但这仍然存在缺陷,因为Button您刚刚单击的 将具有焦点,因此您实际上不会填充任何TextBox.

您在这里有两个主要选择。首先,您可以使用在Button单击时不会获得焦点的自定义控件。这样,TextBox当您单击时具有焦点的那个仍然具有焦点。或者,您可以通过将其分配给一个字段并使用它来记住哪个控件最后具有焦点。这可能就是我要走的路。

这是第二个选项的快速(即不严格)示例:

Private lastActiveControl As Control

Private Sub TextBoxes_Leave(sender As Object, e As EventArgs) Handles TextBox4.Leave,
                                                                      TextBox3.Leave,
                                                                      TextBox2.Leave,
                                                                      TextBox1.Leave
    lastActiveControl = DirectCast(sender, Control)
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim textBoxes = New Control() {TextBox1, TextBox2, TextBox3, TextBox4}
    Dim lastTextBoxIndex = Array.IndexOf(textBoxes, lastActiveControl)

    If lastTextBoxIndex <> -1 Then
        Dim nextTextBoxIndex = (lastTextBoxIndex + 1) Mod textBoxes.Length
        Dim nextTextBox = textBoxes(nextTextBoxIndex)

        lastActiveControl.Text = "1"
        lastActiveControl.Enabled = False
        nextTextBox.Enabled = True
        nextTextBox.Select()
    End If
End Sub
于 2019-02-22T04:13:57.907 回答
0

这段代码没有做你认为它做的事情:

 If TextBox1.Focus Then

Focus不是布尔属性。在 VB.Net 中,您可以调用不带括号的方法,这就是您在这里所做的。条件块实际上试图设置焦点。而且由于除非您明确处理事件并阻止它,否则这总是会成功,所有这些If条件都会导致True.

要查找哪个控件具有焦点,请执行以下操作:

Public Shared Function FindFocusedControl(control As Control) As Control
    Dim container = TryCast(control,IContainerControl)
    While container IsNot Nothing
        control = container.ActiveControl
        container = TryCast(control, IContainerControl)
    End While
    Return control
End Function
于 2019-02-22T04:56:52.757 回答