2013-03-20 6 views
0

У меня есть 2 текстовых поля, и я должен обрабатывать события с измененным текстом обоих. Пользователь может ввести любое из этих текстовых полей и на основании того, где пользователь сделал ввод, другой нужно изменить. Чтобы предотвратить их переход в бесконечный цикл, я получаю отправителя в 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? А также избегать пустых полей?

+0

Что вы имеете в виду, вы «получить отправителя в C#»? Вы можете сделать то же самое в VB (действительно, ваш код делает это), но это вам совсем не помогает, поскольку это не помешает рекурсии. –

+0

Почему нужно изменить на десятичный? – Kasnady

+0

C# привычка я угадываю..Мое первое время в VB, надо с этим справиться, ненавидеть его уже :) – Sin5k4

ответ

1

Чтобы предотвратить их вдаваясь в бесконечный цикл, я получаю отправителя в C#

Неясно, что вы имеете в виду под этим. В любом случае, вы можете сделать то же самое в VB.

В действительности, сравнивая sender не поможет вам здесь, потому что sender известно: для TextBox1_TextChanged это всегдаTextBox1, и txtmt_TextChanged всегда txtmt, если вы звоните в *_TextChanged обработчики событий вручную где-то в кода, и вы не должны этого делать.

Проблема заключается в следующем: если вы измените содержание txtmt в TextBox1_TextChanged, это изменение поднимет txtmt_TextChanged и наоборот. Мы можем предотвратить это, временно отвязав обработчик события, произведя изменение и снова подключив его.

В VB, это делается с помощью RemoveHandler и AddHandler (эквивалент в C# будет использовать -= и +=).

Другое примечание по коду: Всегда используйте 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. Это означает, что вы должны подключить эти события вручную в обработчик события :

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

Это было очень полезно. – Sin5k4

-1

использование If not (sender is nothing) andalso Ctype(sender,textbox).name=textbox1.name Then

Вместо If (sender Is TextBox1) Then

+0

Нет, это совершенно не нужно. Во-первых, вам не нужно проверять «ничего», потому что «отправитель» никогда не будет «ничего». Во-вторых, используйте 'DirectCast' вместо' CType'. В-третьих, не отбрасывайте и не сравнивайте имя, оно не имеет преимущества перед сравнением для эквивалентности объекта. Ваше решение - это, по сути, плохой способ сделать то, что OP уже делает намного лучше. –

+0

@KonradRudolph В принципе, 1. OP не нужно проверять, является ли отправитель текстовым полем1 или нет в его вопросе, потому что это событие само прослушивает текстовое изменение textbox1. 2.] Не нужно проверять Nothing, потому что отправитель никогда не будет Nothing._ предположим, если OP вызвал это событие вручную, как этот 'Dim xObj as Object = no call textbox1_textchanged (xObj, new eventargs)', тогда отправитель будет быть ничем. Так просто, этот вопрос неясно, чтобы смутить ответчиков, этот нижний план должен был быть дан для этого вопроса ...! –

+0

Ну, вы не вызываете события вручную. Сделать это неправильно. –

Смежные вопросы