0

我有 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 中做到这一点?并且还要避免空值?

4

2 回答 2

1

为了防止它们进入无限循环,我在 c# 中获取了发送者

目前尚不清楚您的意思是什么。在任何情况下,你都可以在 VB 中做同样的事情。

实际上,比较 ​​在sender这里对您没有帮助,因为sender众所周知:因为TextBox1_TextChanged总是 TextBox1,并且因为txtmt_TextChanged它总是txtmt,除非您*_TextChanged在代码中的其他地方手动调用事件处理程序,并且您不应该这样做。

这里的问题如下:如果您更改txtmtin的内容TextBox1_TextChanged,该更改将引发txtmt_TextChanged,反之亦然。我们可以通过暂时解除事件处理程序、影响更改并重新挂钩来防止这种情况发生。

在 VB 中,这是通过RemoveHandlerand完成AddHandler的(C# 中的等价物是使用-=and +=)。

代码上的另一个注释:始终Option Strict On在 VB 中使用。这可以实现更严格的类型检查。有一个广泛的共识是,该选项应该始终打开,并且没有不使用它的好借口(处理遗留 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

请注意,为了使用AddHandlerand RemoveHandler,我们不得不删除该Handles子句。这意味着您必须在Form_Load事件处理程序中手动连接这些事件:

AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
AddHandler textmt.TextChanged, AddressOf textmt_TextChanged
于 2013-03-20T11:27:27.673 回答
-1

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

Instead of If (sender Is TextBox1) Then

于 2013-03-20T09:39:44.657 回答