それらが無限ループに入るのを防ぐために、私は送信者をc#で取得します
それが何を意味するのかは不明です。いずれにせよ、VBでも同じことができます。
実際には、は既知sender
であるため、ここで比較しても役に立ちません。コード内の別の場所でイベントハンドラーを手動で呼び出さない限り、常にであり、常にです。そうすべきではありません。sender
TextBox1_TextChanged
TextBox1
txtmt_TextChanged
txtmt
*_TextChanged
ここでの問題は次のとおりです。inの内容を変更すると、その変更によってが発生txtmt
し、その逆も同様です。これを防ぐには、イベントハンドラーのフックを一時的に解除し、変更を有効にしてから、再度フックします。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
とを使用するにRemoveHandler
は、残念ながらHandles
句を削除する必要があることに注意してください。Form_Load
これは、これらのイベントをイベントハンドラーで手動でフックする必要があることを意味します。
AddHandler TextBox1.TextChanged, AddressOf TextBox1_TextChanged
AddHandler textmt.TextChanged, AddressOf textmt_TextChanged