0

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でそれをどのように行うのですか?また、null vlauesを避けますか?

4

2 に答える 2

1

それらが無限ループに入るのを防ぐために、私は送信者を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
于 2013-03-20T11:27:27.673 に答える
-1

使用するIf not (sender is nothing) andalso Ctype(sender,textbox).name=textbox1.name Then

それ以外のIf (sender Is TextBox1) Then

于 2013-03-20T09:39:44.657 に答える