如何防止抛出多个SelectedIndexChanged事件?

时间:2012-06-14 16:28:13

标签: vb.net winforms

我在winforms中有一个组合框,根据你选择的内容,它决定了其他组合框中填充的内容。我使用数据视图填充了最初的组合框:

combobox_process.DataSource = dataview
combobox_process.DisplayMember = "UserDefine1"
combobox_process.SelectedIndex = -1

哪个行正常,除了每一行都抛出SelectedIndexChanged事件。填充下一个组合框的函数会侦听该事件,因此它会运行三次。我问了一个同事,他建议只循环数据并手动将它们全部添加为字符串,但如果可以,我宁愿坚持数据绑定。特别是如果将来我需要做一些我只能用数据绑定做的事情。

有什么想法?也许某种方法可以在此代码的一部分期间禁用该事件?

2 个答案:

答案 0 :(得分:3)

当您不想要它们时触发事件是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说的那样,关闭事件处理程序。当您知道两个或更多事件处理程序将受到影响时,标记方法可能会更好。

答案 1 :(得分:1)

您可以在拨打电话之前取消绑定事件处理程序,然后在调用完成后重新绑定它。