几个月前我问过这个问题。我有一个带有 selectedindexchanged 处理程序的子例程,它在更改控件的选定索引时调用自身。
有人告诉我有两种方法可以解决这个问题,一个公共布尔值,或者在运行时添加和删除事件处理程序。我开始发现更多此类问题的案例。解决它们的最佳做法是什么?
公共布尔值似乎是一个简单但混乱的解决方案,因为我最终会得到几个与是否应该运行不同的子例程有关的公共布尔值。添加和删除处理程序似乎更干净,但感觉就像我要求编译器做很多工作。
您可以在事件处理程序中使用静态布尔值。这是一个使用 TextBox.TextChanged 事件处理程序的简短示例。
Private Sub TextBox1_TextChanged(sender As Object, _
e As EventArgs) Handles TextBox1.TextChanged
Debug.WriteLine("1")
Static reentrant As Boolean = False
If Not reentrant Then
Debug.WriteLine("2")
reentrant = True
TextBox1.Text = TextBox1.Text.ToUpper
reentrant = False
Else
Debug.WriteLine("3")
End If
Debug.WriteLine("4")
End Sub
另一种选择是仅在需要更改文本时才更改文本(仅在分配文本属性时引发该事件)。这将像其他程序一样产生 2 次例程运行,但不会出现与布尔值相同的额外事件。
Private Sub TextBox1_TextChanged(sender As Object, _
e As EventArgs) Handles TextBox1.TextChanged
if not TextBox1.Text = TextBox1.Text.ToUpper then
TextBox1.Text = TextBox1.Text.ToUpper
End If
End Sub