MessageBox 显示两次而不是一次

MessageBox displaying twice rather once

我的表单上有一个 UltraComboBox 控件,它使用以下代码。

Private Sub cmbType_ValueChanged(sender as Object, e as EventArgs) Handles cmbType.ValueChanged
  If cmbType.Value <> "" Then
       If cmbType.Value = "Custom Template" Then
           Dim da As New OleDbDataAdapter("SELECT * FROM [System Settings]", con)
           Dim ds As New DataSet
           Da.Fill(ds)

           If ds.Tables(0).Rows(0).Item("enableTemplate") = False Then
               MessageBox.Show("Custom Templates have not been enabled at system level.", "Cannot Add Custom Template", MessageBoxButtons.OK, MessageBoxIcon.Information)
               cmbType.Value = ""
           End If
       ElseIf cmbType.Value = "Default Template"
           ' ...
       End If
  End If
End Sub

我遇到的问题是,在关闭 MessageBox 后,它会将值设置为“”,然后迭代代码,然后由于某种原因再次执行,但值又回到了"Custom Template",因此 MessageBox 第二次显示。

代码有问题吗,或者有更简单的方法吗?

编辑

以下没有影响它,所以我假设我没有正确解释@Steve 的建议。

If ds.Tables(0).Rows(0).Item("enableTemplate") = False Then
    MessageBox.Show("Custom Templates have not been enabled at system level.", "Cannot Add Custom Templates", MessageBoxButtons.OK, MessageBoxIcon.Information)
    RemoveHandler cmbType.ValueChanged, AddressOf cmbType_ValueChanged
    cmbType.Value = ""
    AddHandler cmbType.ValueChanged, AddressOf cmbType_ValueChanged
End If

编辑 2

根据@HansPasssant 的建议:

If ds.Tables(0).Rows(0).Item("enableTemplate") = False Then
    Me.BeginInvoke(Sub() MessageBox.Show("Custom Templates have not been enabled at system level.", "Cannot Add Custom Templates", MessageBoxButtons.OK, MessageBoxIcon.Information))
    RemoveHandler cmbType.ValueChanged, AddressOf cmbType_ValueChanged
    cmbType.Value = ""
    AddHandler cmbType.ValueChanged, AddressOf cmbType_ValueChanged
End If

这仍然显示 MessageBox 两次。

如果它是 UltraCombo 中的错误,那么您有 2 个选择:

1) 使用常规 ComboBox 做同样的事情 - 虽然它看起来会有所不同,因此最终用户可能对此并不完全满意。

2) 或者,如果您在 DropDownList 中没有很多项目,您可以在 GroupBox 中使用 RadioButtons 来做同样的事情。

然后,如果自定义模板RadioButton.Checked = True,运行同样检查并输出MessageBox

如果不升级控件,您真的无能为力,所以我想这是您唯一的两个选择。

当您在 ValueChanged 事件中设置组合的值时,您将强制再次触发此事件。当您处于事件的中间时,这可能会像您的情况一样导致奇怪的结果。你可以做的是通过它的 EventManager 关闭 UltraCombo 的事件,就在设置它的值之前,通过设置:

UltraCombo.EventManager.AllEventsEnabled = 假

然后,在设置值后,将所有启用的事件设置回 true