それらが無限ループに入るのを防ぐために、私は送信者をc#で取得します
それが何を意味するのかは不明です。いずれにせよ、VBでも同じことができます。
実際には、は既知senderであるため、ここで比較しても役に立ちません。コード内の別の場所でイベントハンドラーを手動で呼び出さない限り、常にであり、常にです。そうすべきではありません。senderTextBox1_TextChanged TextBox1txtmt_TextChangedtxtmt*_TextChanged
ここでの問題は次のとおりです。inの内容を変更すると、その変更によってが発生txtmtし、その逆も同様です。これを防ぐには、イベントハンドラーのフックを一時的に解除し、変更を有効にしてから、再度フックします。TextBox1_TextChangedtxtmt_TextChanged
VBでは、これはRemoveHandlerandを介して行われAddHandlerます(C#の同等のものはandを使用-=し+=ます)。
コードに関する別の注意:常にOption Strict OnVBで使用してください。これにより、より厳密な型チェックが可能になります。このオプションは常にオンにする必要があり、使用しない理由は適切ではないという幅広いコンセンサスがあります(レガシー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