Vb.net 基于其他文本框更改文本框的值;

Vb.net 基于其他文本框更改文本框的值;,vb.net,Vb.net,我有两个文本框,我必须处理这两个文本框的textchanged事件。用户可以输入其中一个文本框,根据用户输入的位置,另一个文本框需要更改。为了防止它们进入无限循环,我在c#中获取发送者,但我在VB中无法做到这一点 Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged If (sender Is TextBox1) T

我有两个文本框,我必须处理这两个文本框的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中做到这一点?同时还要避免空符?

如果不是空符,则使用
(发送者为空),并使用Ctype(发送者,文本框)。name=textbox1.name然后使用

而不是
如果(发送者是TextBox1),则

为了防止它们进入无限循环,我将发送方设置为c#

不清楚你说的是什么意思。在任何情况下,您都可以在VB中执行相同的操作

实际上,比较
发送者
对您没有帮助,因为
发送者
是已知的:对于
TextBox1\u TextChanged
它总是
TextBox1
,对于
txtmt\u TextChanged
它总是
txtmt
,除非在代码中的其他地方手动调用
*\u TextChanged
事件处理程序,否则不应该这样做

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

在VB中,这是通过
RemoveHandler
AddHandler
完成的(C语言中的等效方法是使用
-=
+=

关于代码的另一个注释:在VB中始终使用
选项Strict on
这将启用更严格的类型检查。人们普遍认为,这个选项应该一直处于启用状态,没有理由不使用它(处理遗留COM互操作时除外)。您的代码无法使用
选项进行编译

启用
选项推断也是一个好主意

因此,我们有以下解决方案:

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\u Load
事件处理程序中手动连接这些事件:

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

你说的“用C#写发件人”是什么意思?你可以在VB中做同样的事情(事实上你的代码就是这么做的),但这对你一点帮助都没有,因为它不会阻止递归。为什么要改成十进制呢?我想是习惯了c。我第一次在VB中,必须把这件事做完,我已经很讨厌了:)那么你会怎么用c做呢?如果你有一个解决方案,你可以把它从字面上1:1翻译成VB。我实际上试过了,只想弄清楚哪个是:If(sender==spinEditYrd){spinEditMt.EditValue=Math.Round((Convert.ToDouble(spinEditYrd.EditValue)/1.0936133),3);}etcNo,这完全没有必要。首先,您不需要检查
Nothing
,因为
sender
永远不会是
Nothing
。其次,使用
DirectCast
而不是
CType
。第三,不要强制转换和比较名称,它在对象等价性方面没有比比较优势。你的解决方案本质上是做OP已经做得更好的事情的坏方法。@KonradRudolph,基本上,1。OP不需要在他的问题中检查发送者是否是textbox1,因为该事件本身正在侦听textbox1的textchange。2.]不需要什么都不检查,因为发件人永远不会是什么都不是。假设考虑,如果OP调用了这个事件,如“<代码> DimeXObj:Object =没有调用TeBoxx1TeXchange(XOBJ,新EvestARGS)< /代码>,那么发送者将一无所获。所以简单地说,这个问题不清楚,让回答者感到困惑,这个问题应该投反对票@KonradRudolph“发送者永远不会一无是处。”这就是我提到这样一个案例的原因。!好的,让我修正一下:如果你的程序正确,
发送方
永远不会是什么。如果它不是什么,那么它就是应用程序中的一个bug,应该会崩溃。不要用
If
语句来防范bug。@KonradRudolph
如果应用程序中没有bug,那么应该崩溃。
我不这么认为,如果你有任何具体的证据(手动调用事件),那么给我。。当然,我不会再遵循这种方法了。!:)那很有用。干杯。