1

我有一段代码,其中表单上 DropDown 模式下的 ComboBox 有一个固定的唯一项的 ArrayList 作为其数据源;通常这对用户来说工作得很好,但很少会发生错误,即 SelectedIndex 无法找到与用户输入的 ComboBox 文本属性所表示的项目相对应的项目(即使它是合法项目)。

更具体地说,用户在 ComboBox 文本字段中键入合法条目作为文本并使用鼠标导航到另一个控件。文本字段继续显示条目,但稍后,当用户使用依赖于与正在显示的文本对应的 SelectedIndex 的方法提交更改时,SelectedIndex 不正确(有时)。

官方文档http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.text.aspx指出:

“将 Text 属性设置为 null 或空字符串 ("") 会将 SelectedIndex 设置为 -1。将 Text 属性设置为 Items 集合中的值会将 SelectedIndex 设置为该项目的索引。将 Text 属性设置为不在集合中的值使 SelectedIndex 保持不变。”

所以合法的文本条目应该将 SelectedIndex 移动到正确的数字。我知道我可以在任何重要的事情发生之前强制对事件处理程序进行一致性检查,但我想知道是什么导致了这个罕见的错误,它在文档面前飞了起来,以更好地理解 ComboBox 实际在做什么。我会很感激任何帮助。

4

2 回答 2

3

对,经过一些测试,这是我的结论。

当您在组合框的文本字段中键入时,您实际上并没有触发索引选择。但是,如果将 Text 属性设置为一个值。即 Combobox1.Text = "Existing item" 然后它设置选定的索引。因此,如果他们键入而不是在组合框中选择,您似乎真的不应该在数据库中获得任何正确的结果。

对,所以这就是它变得愚蠢的地方。这将起作用:

Private Sub ComboBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.TextChanged
    ComboBox1.Text = ComboBox1.Text
End Sub

但是,我建议您改为这样做:

Private Sub ComboBox1_Leave(sender As System.Object, e As System.EventArgs) Handles ComboBox1.Leave
    ComboBox1.Text = ComboBox1.Text
End Sub

为了使我的答案有所不同,我将添加此内容。

如果您为组合框添加这些设置,则键入将在没有离开事件的情况下工作。

    ComboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
    ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems
于 2013-01-25T14:20:57.913 回答
2

当 ComboBox 处于 DropDown 模式时,即使用户未从列表中的项目中进行选择,也不会触发 SelectedIndexChanged。因此,当用户简单地输入一个条目然后使用鼠标导航离开时,selectedIndex 不会改变。为了使其工作,您需要手动处理 ComboBox.Leave 事件,以便选择用户输入的任何文本。

Private Sub ComboBox1_Leave(sender As Object, e As System.EventArgs) Handles ComboBox1.Leave
    ' This will cause the SelectedIndex to be changed, thus firing the Selected_IndexChanged Event:
    ComboBox1.SelectedIndex = ComboBox1.FindStringExact(ComboBox1.Text)
End Sub

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    MsgBox("SelectedIndex =" & ComboBox1.SelectedIndex.ToString())
End Sub
于 2013-01-25T14:20:45.830 回答