.net 组合框文本&;所选索引一致性/行为

.net 组合框文本&;所选索引一致性/行为,.net,vb.net,combobox,.net,Vb.net,Combobox,我有一段代码,其中表单上处于下拉模式的组合框的数据源是一个固定的唯一项数组列表;通常这对用户来说效果很好,但很少会出现错误,即SelectedIndex无法找到与用户输入的ComboBox文本属性所表示的项对应的项(即使它是合法项) 更具体地说,用户在ComboBox文本字段中键入一个合法条目作为文本,然后使用鼠标导航到另一个控件。文本字段继续显示条目,但在稍后的某个时间点,当用户使用依赖于所显示文本对应的SelectedIndex的方法提交更改时,SelectedIndex(有时)不正确 官方

我有一段代码,其中表单上处于下拉模式的组合框的数据源是一个固定的唯一项数组列表;通常这对用户来说效果很好,但很少会出现错误,即SelectedIndex无法找到与用户输入的ComboBox文本属性所表示的项对应的项(即使它是合法项)

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

官方文件指出:

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


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

当组合框处于下拉模式时,如果用户未从列表中的项目中进行选择,则不会触发SelectedIndexChanged。因此,当用户只是在中键入一个条目,然后使用moouse导航离开时,selectedIndex不会更改。为了使其工作,您需要手动处理组合框。保留事件,以便用户键入的任何文本都被选中

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

当组合框处于下拉模式时,如果用户未从列表中的项目中进行选择,则不会激发SelectedIndexChanged。因此,当用户只是在中键入一个条目,然后使用moouse导航离开时,selectedIndex不会更改。为了使其工作,您需要手动处理组合框。保留事件,以便用户键入的任何文本都被选中

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

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

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

对,这就是它变得愚蠢的地方。这将有助于:

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

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

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

对,这就是它变得愚蠢的地方。这将有助于:

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


我只是想知道你用什么语言来编写代码。你有什么错误?更具体一点对回答你的问题会有很大帮助。那么你的问题是什么?我的问题是使用combobox时的最佳实践是什么?是否有一些设置我忽略设置会导致此错误?我的第一个想法是不一致。我猜“item1”和“item1”不一样。这可能是您的问题,以防它不够聪明,无法捕捉到这一点。有一个outlook电子邮件正文和数据库条目的输出日志。电子邮件正文正确地包含组合框文本(大写和全部),但依赖于SelectedIndex的数据库条目不正确。这就是我诊断的原因。我只是想知道你用什么语言来编写代码。你有什么错误?更具体一点对回答你的问题会有很大帮助。那么你的问题是什么?我的问题是使用combobox时的最佳实践是什么?是否有一些设置我忽略设置会导致此错误?我的第一个想法是不一致。我猜“item1”和“item1”不一样。这可能是您的问题,以防它不够聪明,无法捕捉到这一点。有一个outlook电子邮件正文和数据库条目的输出日志。电子邮件正文正确地包含组合框文本(大写和全部),但依赖于SelectedIndex的数据库条目不正确。这就是我如何得出诊断结果的。啊,你用了13秒就把我打败了:(是的,但我忘了在SelectedIndexChanged处理程序中添加.ToString()。:-)修复了。:-)幸运的是,为了避免看起来像驴子,我找到了额外的信息。如果您使用&而不是+您的messagebox,那么就可以了:)啊!我在C#工作了很多年,不再在VB工作了。“+”是C#中的标准连接字符。哎呀!+可以,但两部分都必须是字符串。与&没关系。是的,我也有;关于反射:)我也做“字符串变量名”,当它不起作用时会生气。Dim variablename as String在C#:PArgh中花了一些时间后让人恼火,你用了13秒击败了我:(是的,但我忘了在中添加.ToString()