Чтобы предотвратить их вдаваясь в бесконечный цикл, я получаю отправителя в 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
Что вы имеете в виду, вы «получить отправителя в C#»? Вы можете сделать то же самое в VB (действительно, ваш код делает это), но это вам совсем не помогает, поскольку это не помешает рекурсии. –
Почему нужно изменить на десятичный? – Kasnady
C# привычка я угадываю..Мое первое время в VB, надо с этим справиться, ненавидеть его уже :) – Sin5k4