当我不想要时触发事件

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 没有。可能不是问题,但需要考虑。