winforms 从ComboBox自身SelectedIndexChanged事件处理程序更改ComboBox文本

ddrv8njm  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(239)

我正在尝试创建一个显示当前状态的组合框,并让其选项更改程序的状态。
虽然它工作,我不能让它显示当前状态。
每当引发一个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按预期更改?

e37o9pze

e37o9pze1#

当引发ComboBox的SelectedIndexChanged事件时,基础代码还会向ComboBox发送一条消息以更新其文本(以下是有关它的说明)。
这意味着,当您设置ComboBox的Text时,它会在事件处理程序退出后立即使用SelectedItem([ComboBox].GetItemText(Items(SelectedIndex)))的文本进行更新。
通过使用BeginInvoke()延迟执行设置Text属性的代码,可以在更新ComboBox的文本之后执行操作,因此可以 * 覆盖 * 前面提到的过程:

Private Sub cbSelect_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbSelect.SelectedIndexChanged
    If cbSelect.SelectedIndex < 0 Then Return
    Dim cboText = string.Empty
    Select Case cbSelect.GetItemText(cbSelect.SelectedItem)
        Case "Something"
            cboText = "Other"
        ' [...] 
    End Select
    BeginInvoke(new Action(Sub() cbSelect.Text = cboText))
End Sub

主动建议:
您可以使用Dictionary(Of String String)来存储要设置的值,并使用SelectedItems文本值作为Dictionary的Key来检索相应的文本,因此您只需要使用[Dictionary].ContainsKey()来验证所选文本,然后获取用于更改ComboBox的Text的匹配值。

相关问题