我正在尝试创建一个显示当前状态的组合框,并让其选项更改程序的状态。
虽然它工作,我不能让它显示当前状态。
每当引发一个ComboBox事件时,当我将ComboBox.Text属性设置为任何值时,它都会被忽略,而我选择的任何值都会被设置。我可以将SelectedIndex更改为-1,它会清空Edit控件,但即使在此之后,我也无法更改comboboxthe Text,就好像该事件在其他事件之前被触发一样。
添加一个命令按钮确实可以让我很好地更改组合框的文本。
下面是我的测试应用程序:
创建按钮bComboAdd
、标签lTest
和组合框:cbSelect
.
将两个项目添加到cbSelect
,并将Text设置为不同的内容。
在我的测试中,我将项目设置为"Set to ,"
和"Set to ;"
。
请使用下列程式码:
Private Sub bComboAdd_Click(sender As Object, e As EventArgs) Handles bComboAdd.Click
me.cbSelect.Text = "Testing"
me.lTest.Text = "Testing"
End Sub
Private Sub cbSelect_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbSelect.SelectedIndexChanged
Select Case Me.cbSelect.SelectedIndex
Case 0
Me.cbSelect.Text = "Mode: ,"
me.lTest.Text = "Mode: ,"
Case 1
Me.cbSelect.Text = "Mode: ;"
me.lTest.Text = "Mode: ;"
End Select
End Sub
cbSelect.Text = [...]
被忽略,而lTest.Text
工作正常。
我单击ComboBox,将其设置为"Set to ;"
,文本更改为"Set to ;"
,而标签更改为"mode: ;"
我也试过这个,同样的结果:
Private Sub cbSelect_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbSelect.SelectedIndexChanged
Select Case Me.cbSelect.SelectedItem
Case "Set to ,"
Me.cbSelect.Text = "Mode: ,"
Me.lTest.Text = "Mode: ,"
Case "Set to ;"
Me.cbSelect.Text = "Mode: ;"
Me.lTest.Text = "Mode: ;"
End Select
End Sub
现在,如果我将状态文本作为可选文本添加到列表中,即使在运行时,它也能工作。但如果我在运行时再次删除它们,它就不能工作。因此,似乎有某种验证正在进行,但只有当我从控件本身设置文本时。
如何使ComboBox的Text按预期更改?
1条答案
按热度按时间e37o9pze1#
当引发ComboBox的SelectedIndexChanged事件时,基础代码还会向ComboBox发送一条消息以更新其文本(以下是有关它的说明)。
这意味着,当您设置ComboBox的Text时,它会在事件处理程序退出后立即使用SelectedItem(
[ComboBox].GetItemText(Items(SelectedIndex))
)的文本进行更新。通过使用BeginInvoke()延迟执行设置Text属性的代码,可以在更新ComboBox的文本之后执行操作,因此可以 * 覆盖 * 前面提到的过程:
主动建议:
您可以使用
Dictionary(Of String String)
来存储要设置的值,并使用SelectedItems文本值作为Dictionary的Key来检索相应的文本,因此您只需要使用[Dictionary].ContainsKey()来验证所选文本,然后获取用于更改ComboBox的Text的匹配值。