我有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中做到这一点?还要避免空值吗?
答案 0 :(得分:1)
为防止它们进入无限循环,我在c#
中获取发件人
目前还不清楚你的意思。无论如何,你可以在VB中做同样的事情。
实际上,比较sender
对您没有帮助,因为已知sender
:TextBox1_TextChanged
总是 TextBox1
,对于txtmt_TextChanged
,它总是txtmt
,除非您在代码中的其他位置手动调用*_TextChanged
事件处理程序,并且您不应该这样做。
此处的问题如下:如果您更改txtmt
中TextBox1_TextChanged
的内容,则该更改将提升txtmt_TextChanged
,反之亦然。我们可以通过暂时取消事件处理程序,实现更改并重新挂钩来防止这种情况。
在VB中,这是通过RemoveHandler
和AddHandler
完成的(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
请注意,为了使用AddHandler
和RemoveHandler
,遗憾的是我们必须删除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