实时添加多个文本框

Adding multiple textboxes real time

当我 运行 我的代码时,我能够成功地将值输入其他文本框,但它不会实时将所有值汇总到文本框 (txttotalcount) 中。它保持为空白文本框。

我试过使用 txttotalcount_TextChanged。我读过的所有其他来源都使用 Button_Click,但我希望算法实时发生(无需单击按钮)。

我定义了我的文本框以在按下按钮时添加 +1 增量:

Private Sub btnPMN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPMN.Click
    'Add +1 to PMN Textbox (txtPMN)

    txtPMN.Text = (Val(txtPMN.Text) + 1).ToString()
End Sub

Private Sub BtnBand_Click(sender As Object, e As EventArgs) Handles btnBand.Click
    'Add +1 to Band Textbox (txtBand)

    txtBand.Text = (Val(txtBand.Text) + 1).ToString()
End Sub

然后我尝试获取这些文本框值并将其添加到最终文本框 (txttotalcount):

Private Sub Txttotalcount_TextChanged(sender As Object, e As EventArgs) Handles txttotalcount.TextChanged
    'Adds all text boxes 
    txttotalcount.text = txtPMN.Text + txtBand.Text


End Sub

我想实时将所有文本框汇总到一个名为 txttotalcount.text 的最终文本框(无按钮点击)

当我 运行 我的代码时,txttotalcount 保持空白,尽管其他文本框中有值。

执行此操作的正确方法是验证两个输入,并且仅在用户完成输入两个有效输入时才执行求和,例如

Private Sub TextBoxes_Validating(sender As Object, e As ComponentModel.CancelEventArgs) Handles TextBox2.Validating,
                                                                                                TextBox1.Validating
    Dim source = DirectCast(sender, TextBox)

    If source.TextLength > 0 AndAlso Not Integer.TryParse(source.Text, Nothing) Then
        source.SelectAll()
        source.HideSelection = False

        MessageBox.Show("Please enter a valid integer")

        source.HideSelection = True

        'Don't let the control lose focus with invalid contents.
        e.Cancel = True
    End If
End Sub

Private Sub TextBoxes_Validated(sender As Object, e As EventArgs) Handles TextBox2.Validated,
                                                                          TextBox1.Validated
    If TextBox1.TextLength > 0 AndAlso TextBox2.TextLength > 0 Then
        Label1.Text = (CInt(TextBox1.Text) + CInt(TextBox2.Text)).ToString()
    End If
End Sub

请注意,算法不会在用户键入时发生,而是在他们离开控件时发生。无需单击 Button,但焦点必须离开 TextBoxes。如果你真的想的话,你可以在输入发生变化时同时进行验证和算术运算,但我真的不明白向用户显示他们不感兴趣的结果有什么意义。

Private Sub TextBoxes_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged,
                                                                            TextBox1.TextChanged
    Dim input1 As Integer
    Dim input2 As Integer

    If TextBox1.TextLength > 0 AndAlso
       TextBox2.TextLength > 0 AndAlso
       Integer.TryParse(TextBox1.Text, input1) AndAlso
       Integer.TryParse(TextBox2.Text, input2) Then
        Label1.Text = (input1 + input2).ToString()
    Else
        Label1.ResetText()
    End If
End Sub

请不要使用 Val。那是 vb6 的遗留物。在处理用户输入时,TryParse 是一个不错的选择,因为您不能依赖用户输入您期望的内容。

查看您用于求和的事件。是什么改变了文本以触发此事件?如果你能启动它,你可能会创建一个循环引用,因为你在 Texttotalcount.TextChanged 事件中更改了 Txttotalcount 的文本。

更新按钮点击总数。

正在维护这行代码...

txttotalcount.text = txtPMN.Text + txtBand.Text

这不会让您得到预期的结果。 .Text 属性 是一个字符串。当编译器看到加号时,它会假定您要连接字符串。假设您在一个文本框中有一个 5,在另一个文本框中有一个 7。 txttotalcount 将显示 57。“5”+“7”。如果你想做加法,你必须使用数字而不是字符串。

Private Sub btnPMN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPMN.Click
    Dim Band As Integer
    Dim PMN As Integer
    If Integer.TryParse(txtPMN.Text, Band) Then
        PMN += 1
        txtPMN.Text = PMN.ToString
    Else
        MessageBox.Show("Please enter a valid number in PMN")
        Exit Sub
    End If
    'Band will be zero if the parse fails
    Integer.TryParse(txtBand.Text, Band)
    txttotalcount.Text = (PMN + Band).ToString
End Sub

Private Sub BtnBand_Click(sender As Object, e As EventArgs) Handles btnBand.Click
    Dim Band As Integer
    Dim PMN As Integer
    If Integer.TryParse(txtBand.Text, Band) Then
        Band += 1
        txtBand.Text = Band.ToString
    Else
        MessageBox.Show("Please enter a valid number in Band")
        Exit Sub
    End If
    'PMN will be zero if the parse fails
    Integer.TryParse(txtPMN.Text, PMN)
    txttotalcount.Text = (PMN + Band).ToString
End Sub

这是另一种方法:

Private Sub btnPMN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPMN.Click
    'Add +1 to PMN Textbox (txtPMN)
    If IsNumeric(txtPMN.Text) Then
        txtPMN.Text = (CLng(txtPMN.Text) + 1).ToString
    Else
        txtPMN.Text = "1"
    End If
    Calculate()
End Sub

Private Sub BtnBand_Click(sender As Object, e As EventArgs) Handles BtnBand.Click
    'Add +1 to Band Textbox (txtBand)
    If IsNumeric(txtBand.Text) Then
        txtBand.Text = (CLng(txtBand.Text) + 1).ToString
    Else
        txtBand.Text = "1"
    End If
    Calculate()
End Sub

Private Sub Calculate()
    txttotalcount.Text = "0"
    Dim myBand As Long = 0
    Dim myPMN As Long = 0
    If IsNumeric(txtBand.Text) Then myBand = CLng(txtBand.Text)
    If IsNumeric(txtPMN.Text) Then myPMN = CLng(txtPMN.Text)
    txttotalcount.Text = (myBand + myPMN).ToString("#,##0")
End Sub

或者您可以使用这些作为替代:

Private Sub btnPMN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPMN.Click
    txtIncrement(txtPMN, 1)
    Calculate()
End Sub

Private Sub BtnBand_Click(sender As Object, e As EventArgs) Handles BtnBand.Click
    txtIncrement(txtBand, 1)
    Calculate()
End Sub

Private Sub txtIncrement(ByRef myTextBox As TextBox, increment As Integer)
    If IsNumeric(myTextBox.Text) Then myTextBox.Text = (CLng(myTextBox.Text) + increment).ToString Else myTextBox.Text = 0
End Sub

Private Sub Calculate()
    txttotalcount.Text = "0"
    Dim myBand As Long = 0
    Dim myPMN As Long = 0
    If IsNumeric(txtBand.Text) Then myBand = CLng(txtBand.Text)
    If IsNumeric(txtPMN.Text) Then myPMN = CLng(txtPMN.Text)
    txttotalcount.Text = (myBand + myPMN).ToString("#,##0")
End Sub