当我不想要时触发事件
Event is triggered when I do not want it
我对组合框的行为有疑问,更准确地说是关于 Selected-Index-Changed-Eventhandler。
在这个测试项目中,我单击组合框中的第一个条目。正确的是,“Something happening here”出现在下面的输出 window 中。但是如果我再次点击同一个条目,事件将再次被触发。这是不应该发生的。有什么技巧可以防止这种情况发生吗?我只想创建一个变量(oldIndex)并将当前索引与旧索引进行比较。
编辑
Public NotInheritable Class FormMain
Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ComboBox1.Items.AddRange({"1", "2", "3"})
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
If ComboBox1.SelectedIndex <> (-1) Then
Debug.WriteLine("Something hapening here")
Select Case ComboBox1.SelectedIndex
Case 0
TextBox1.Text = "1"
Case 1
TextBox1.Text = "2"
Case 2
TextBox1.Text = "3"
Case Else
Exit Select
End Select
End If
End Sub
End Class
SelectedIndex
属性 的实施实际上已经防止了这些虚假事件,但似乎通过 UI 选择项目实际上并没有导致 SelectedIndex
属性待设置。我们可以做的是继承 ComboBox
class 并自己跟踪 SelectedIndex
然后如果 属性 值没有实际改变则简单地中止 SelectedIndexChanged
事件:
Public Class ComboBoxEx
Inherits ComboBox
Private _selectedIndex As Integer = Integer.MinValue
Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs)
If _selectedIndex = SelectedIndex Then
'The selection hasn't actually changed.
Return
End If
_selectedIndex = SelectedIndex
MyBase.OnSelectedIndexChanged(e)
End Sub
End Class
如果您向项目添加新的 class,添加该代码然后构建,新控件将出现在您的工具箱中。然后您可以将其添加到表单而不是常规 ComboBox
。如果您已经有一个带有常规 ComboBox
的表单,那么您可以打开设计器代码文件并更改现有控件的类型。请确保您先有一个备份,以防您犯错并杀死您的表单。
这里有几点需要注意。首先,SelectionChangeCommitted
事件的行为方式相同,因此您可能也应该覆盖相应的方法。如果您不使用该事件,则它并不太重要。这段代码确实处理了 SelectedValueChanged
事件。
其次,我不确定这段代码是否有时会导致问题,例如实际项目选择已更改,但 SelectedIndex
没有。可能不是问题,但需要考虑。
我对组合框的行为有疑问,更准确地说是关于 Selected-Index-Changed-Eventhandler。
在这个测试项目中,我单击组合框中的第一个条目。正确的是,“Something happening here”出现在下面的输出 window 中。但是如果我再次点击同一个条目,事件将再次被触发。这是不应该发生的。有什么技巧可以防止这种情况发生吗?我只想创建一个变量(oldIndex)并将当前索引与旧索引进行比较。
编辑
Public NotInheritable Class FormMain
Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ComboBox1.Items.AddRange({"1", "2", "3"})
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
If ComboBox1.SelectedIndex <> (-1) Then
Debug.WriteLine("Something hapening here")
Select Case ComboBox1.SelectedIndex
Case 0
TextBox1.Text = "1"
Case 1
TextBox1.Text = "2"
Case 2
TextBox1.Text = "3"
Case Else
Exit Select
End Select
End If
End Sub
End Class
SelectedIndex
属性 的实施实际上已经防止了这些虚假事件,但似乎通过 UI 选择项目实际上并没有导致 SelectedIndex
属性待设置。我们可以做的是继承 ComboBox
class 并自己跟踪 SelectedIndex
然后如果 属性 值没有实际改变则简单地中止 SelectedIndexChanged
事件:
Public Class ComboBoxEx
Inherits ComboBox
Private _selectedIndex As Integer = Integer.MinValue
Protected Overrides Sub OnSelectedIndexChanged(e As EventArgs)
If _selectedIndex = SelectedIndex Then
'The selection hasn't actually changed.
Return
End If
_selectedIndex = SelectedIndex
MyBase.OnSelectedIndexChanged(e)
End Sub
End Class
如果您向项目添加新的 class,添加该代码然后构建,新控件将出现在您的工具箱中。然后您可以将其添加到表单而不是常规 ComboBox
。如果您已经有一个带有常规 ComboBox
的表单,那么您可以打开设计器代码文件并更改现有控件的类型。请确保您先有一个备份,以防您犯错并杀死您的表单。
这里有几点需要注意。首先,SelectionChangeCommitted
事件的行为方式相同,因此您可能也应该覆盖相应的方法。如果您不使用该事件,则它并不太重要。这段代码确实处理了 SelectedValueChanged
事件。
其次,我不确定这段代码是否有时会导致问题,例如实际项目选择已更改,但 SelectedIndex
没有。可能不是问题,但需要考虑。