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
我的表单上有一个 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