Vb.net 如何防止引发多个SelectedIndexChanged事件?

Vb.net 如何防止引发多个SelectedIndexChanged事件?,vb.net,winforms,Vb.net,Winforms,我在winforms中有一个组合框,它根据您选择的内容确定在其他组合框中填充的内容。我使用dataview填充了初始组合框: combobox_process.DataSource = dataview combobox_process.DisplayMember = "UserDefine1" combobox_process.SelectedIndex = -1 除了每一行都抛出SelectedIndexChanged事件外,它工作正常。填充下一个组合框的函数侦听该事件,因此它运行了三次。

我在winforms中有一个组合框,它根据您选择的内容确定在其他组合框中填充的内容。我使用dataview填充了初始组合框:

combobox_process.DataSource = dataview
combobox_process.DisplayMember = "UserDefine1"
combobox_process.SelectedIndex = -1
除了每一行都抛出SelectedIndexChanged事件外,它工作正常。填充下一个组合框的函数侦听该事件,因此它运行了三次。我问了一位同事,他建议只循环数据,并将它们作为字符串手动添加,但如果可以的话,我更愿意坚持数据绑定。特别是如果将来我需要做一些我只能用数据绑定来做的事情


有什么想法吗?也许可以在这段代码的某一部分中禁用该事件?

您可以在调用之前解除事件处理程序的绑定,然后在调用完成时重新绑定。

您可以在调用之前解除事件处理程序的绑定,然后在调用完成时重新绑定。

当您不希望事件被触发时,事件将被触发Windows窗体中的常见问题—SelectedIndexChanged就是一个典型的例子。我经常使用的一种方法是声明一个标志,该标志在运行我知道会在我不感兴趣的时候触发事件的代码部分时设置

例如:

Public Class Form1
    Private m_IsSettingDataSource As Boolean = False

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Me.m_IsSettingDataSource = True
            combobox_process.DataSource = DataView
            combobox_process.DisplayMember = "UserDefine1"
            combobox_process.SelectedIndex = -1
        Catch
            Throw
        Finally
            Me.m_IsSettingDataSource = False
        End Try
    End Sub

    Private Sub combobox_process_SelectedIndexChanged(sender As Object, e As EventArgs) Handles combobox_process.SelectedIndexChanged
        If Not Me.m_IsSettingDataSource Then
            ' Do what you want to do when not setting data source
        End If
    End Sub
End Class

您可以这样做,或者像John说的那样,关闭和打开事件处理程序。当您知道两个或多个事件处理程序将受到影响时,标记方法可能会更好。

事件在您不希望的情况下触发是Windows窗体中的常见问题-SelectedIndexChanged就是一个典型的示例。我经常使用的一种方法是声明一个标志,该标志在运行我知道会在我不感兴趣的时候触发事件的代码部分时设置

例如:

Public Class Form1
    Private m_IsSettingDataSource As Boolean = False

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Me.m_IsSettingDataSource = True
            combobox_process.DataSource = DataView
            combobox_process.DisplayMember = "UserDefine1"
            combobox_process.SelectedIndex = -1
        Catch
            Throw
        Finally
            Me.m_IsSettingDataSource = False
        End Try
    End Sub

    Private Sub combobox_process_SelectedIndexChanged(sender As Object, e As EventArgs) Handles combobox_process.SelectedIndexChanged
        If Not Me.m_IsSettingDataSource Then
            ' Do what you want to do when not setting data source
        End If
    End Sub
End Class

您可以这样做,或者像John说的那样,关闭和打开事件处理程序。当您知道两个或多个事件处理程序将受到影响时,标志方法可能会更好。

我认为这就是您要查找的-
ComboBox。SelectionChangeCommitted
::我认为这就是您要查找的-
ComboBox。SelectionChangeCommitted
::