Vb.net 基于其他文本框更改文本框的值;
我有两个文本框,我必须处理这两个文本框的textchanged事件。用户可以输入其中一个文本框,根据用户输入的位置,另一个文本框需要更改。为了防止它们进入无限循环,我在c#中获取发送者,但我在VB中无法做到这一点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
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,那么应该崩溃。
我不这么认为,如果你有任何具体的证据(手动调用事件),那么给我。。当然,我不会再遵循这种方法了。!:)那很有用。干杯。