根据其他文本框更改文本框的值;

时间:2013-03-20 09:22:00

标签: vb.net

我有2个文本框,我必须处理两者的textchanged事件。用户可以输入这些文本框中的任何一个,并根据用户输入的位置,另一个需要更改。要防止它们进入一个无限循环,我在c#中得到了发送者,但我不能在VB中做到这一点。

    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    If (sender Is TextBox1) Then
        txtmt.Text = Convert.ToDecimal(TextBox1.Text) * 0.9144
    End If

End Sub

Private Sub txtmt_TextChanged(sender As System.Object, e As System.EventArgs) Handles txtmt.TextChanged
    If (sender Is txtmt) Then
        TextBox1.Text = Convert.ToDecimal(TextBox1.Text) / 0.9144
    End If
End Sub

我们如何在VB中做到这一点?还要避免空值吗?

2 个答案:

答案 0 :(得分:1)

  

为防止它们进入无限循环,我在c#

中获取发件人

目前还不清楚你的意思。无论如何,你可以在VB中做同样的事情。

实际上,比较sender对您没有帮助,因为已知senderTextBox1_TextChanged 总是 TextBox1 ,对于txtmt_TextChanged,它总是txtmt,除非您在代码中的其他位置手动调用*_TextChanged事件处理程序,并且您不应该这样做。

此处的问题如下:如果您更改txtmtTextBox1_TextChanged的内容,则该更改将提升txtmt_TextChanged,反之亦然。我们可以通过暂时取消事件处理程序,实现更改并重新挂钩来防止这种情况。

在VB中,这是通过RemoveHandlerAddHandler完成的(C#中的等效文件将使用-=+=)。

关于代码的另一个注意事项:始终在VB中使用Option Strict On这样可以进行更严格的类型检查。人们普遍认为,这个选项应该始终开启,并且没有一个不使用它的好借口(处理遗留COM互操作时除外)。您的代码无法使用Option Strict进行编译。

启用Option Infer也是个好主意。

有了这个,我们有以下解决方案:

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs)
    ' FIXME: Use proper error handling via TryParse in real code!
    Dim value = Double.Parse(TextBox1.Text)

    ' Prevent raising the event.
    RemoveHandler txtmt.TextChanged, AddressOf txtmt_TextChanged
    txtmt.Text = (value * 0.9144).ToString()
    AddHandler txtmt.TextChanged, AddressOf txtmt_TextChanged
End Sub

Private Sub txtmt_TextChanged(sender As Object, e As EventArgs)
    ' FIXME: Use proper error handling via TryParse in real code!
    Dim value = Double.Parse(txtmt.Text)

    ' Prevent raising the event.
    RemoveHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
    TextBox1.Text = (value / 0.9144).ToString()
    AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
End Sub

请注意,为了使用AddHandlerRemoveHandler,遗憾的是我们必须删除Handles子句。这意味着您必须在Form_Load事件处理程序中手动挂起这些事件:

AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
AddHandler textmt.TextChanged, AddressOf textmt_TextChanged

答案 1 :(得分:-1)

使用If not (sender is nothing) andalso Ctype(sender,textbox).name=textbox1.name Then

而不是If (sender Is TextBox1) Then