Combobox Text& SelectedIndex一致性/行为

时间:2013-01-25 04:33:35

标签: .net vb.net combobox

我有一段代码,其中表单上的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移动到正确的数字。我知道我可以在发生任何重要事件之前强制对事件处理程序进行一致性检查,但我想知道是什么原因可能导致这种罕见的bug在文档面前飞行以更好地理解ComboBox实际上在做什么。我很感激任何帮助。

2 个答案:

答案 0 :(得分:2)

当ComboBox处于DropDown模式时,如果用户未从列表中的项目中进行选择,则不会触发SelectedIndexChanged。因此,当用户简单地键入条目然后使用mouose导航时,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

答案 1 :(得分:2)

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

当您在组合框的文本字段中键入时,实际上并未触发索引选择。但是,如果将Text属性设置为值。即Combobox1.Text =“现有项目”然后它设置所选索引。因此,如果他们输入而不是在组合框中选择,那么您的数据库中似乎确实不应该有任何正确的结果。

是的,所以这就是它变得愚蠢的地方。这将有效:

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