我的表单上有一个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
后,它将值设置为“”,然后迭代代码,然后,由于某种原因,再次执行,但值返回“自定义”模板“,所以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
两次。
答案 0 :(得分:0)
如果是UltraCombo
中的错误,就像是这样,你有两个选择:
1)使用常规ComboBox
做同样的事情 - 尽管如此,它看起来会有所不同,因此最终用户可能对此并不满意。
2)或者,如果DropDownList
中没有大量项目,您可以在RadioButtons
中使用GroupBox
来执行相同的操作。
然后,如果自定义模板RadioButton.Checked = True
,运行相同的检查并输出MessageBox
。
如果没有升级控件,你可以做的很多,所以我猜这些是你唯一的选择。
答案 1 :(得分:0)
在ValueChanged事件中设置组合的值时,您将强制再次触发此事件。当您处于事件中间时,这可能会导致您的情况出现奇怪的结果。您可以做的是通过设置其值,在设置其值之前通过其EventManager转换UltraCombo的事件:
UltraCombo.EventManager.AllEventsEnabled = false
然后,在设置值后,将所有启用的事件设置为true