为了防止它们进入无限循环,我在 c# 中获取了发送者
目前尚不清楚您的意思是什么。在任何情况下,你都可以在 VB 中做同样的事情。
实际上,比较 在sender
这里对您没有帮助,因为sender
众所周知:因为TextBox1_TextChanged
它总是 TextBox1
,并且因为txtmt_TextChanged
它总是txtmt
,除非您*_TextChanged
在代码中的其他地方手动调用事件处理程序,并且您不应该这样做。
这里的问题如下:如果您更改txtmt
in的内容TextBox1_TextChanged
,该更改将引发txtmt_TextChanged
,反之亦然。我们可以通过暂时解除事件处理程序、影响更改并重新挂钩来防止这种情况发生。
在 VB 中,这是通过RemoveHandler
and完成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
请注意,为了使用AddHandler
and RemoveHandler
,我们不得不删除该Handles
子句。这意味着您必须在Form_Load
事件处理程序中手动连接这些事件:
AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
AddHandler textmt.TextChanged, AddressOf textmt_TextChanged