WinForms ComboBox DropDown 和 Autocomplete 窗口都出现

Posted

技术标签:

【中文标题】WinForms ComboBox DropDown 和 Autocomplete 窗口都出现【英文标题】:WinForms ComboBox DropDown and Autocomplete window both appear 【发布时间】:2011-03-05 03:13:06 【问题描述】:

我在一个 winforms 应用程序上有一个ComboBox,代码如下:

comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;

DataTable t = new DataTable();
t.Columns.Add("ID", typeof(int));
t.Columns.Add("Display", typeof(string));

for (int i = 1; i < 2000; i++)

    t.Rows.Add(i, i.ToString("N0"));


comboBox1.DataSource = t;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Display";

然后,当窗口打开时,我按照以下步骤操作:

    单击ComboBox 下拉按钮——这将显示项目列表并选择ComboBox 中的文本 键入“5”、“1”...即我希望使用自动完成功能来搜索 515、516 等。 您会看到自动完成窗口现在出现在下拉列表的顶部。但是,如果我将鼠标悬停在接收鼠标事件(包括点击)的自动完成窗口后面的隐藏下拉窗口。所以我想我是在点击一个自动完成的项目,但实际上是在点击我看不到的完全随机的东西。

这是ComboBox 中的错误吗?如果这很重要,我正在使用 Windows 7。我是否以某种方式配置了ComboBoxwrong?

另请注意,使用 KEYBOARD 会使用自动完成下拉菜单。所以上/下箭头键使用的是前窗,而鼠标使用的是后窗。

【问题讨论】:

这有什么问题 - 他们只是想给你两全其美! 有一个简单有效的解决方法。但既然 SO 告诉我不要回答 cmets 中的问题,我不会。但我确实在下面回答了它......作为一个答案。 【参考方案1】:

在你的ComboBoxKeyDown事件中添加一行代码,问题就解决了!

private void comboBox_NameAndID_KeyDown(object sender, KeyEventArgs e)

    comboBox_NameAndID.DroppedDown = false;

Source

【讨论】:

您在已接受答案下的评论引起了我的注意。感谢那。真的解决了。 非常感谢您的回答和 cmets,它正在解决我长期以来遇到的一个问题......【参考方案2】:

只需从 PropertyGrid 设置属性,就可以得到重现。在 Win7 和 Windows XP 中都以这种方式运行。

这是feedback article 中记录的错误行为。如前所述,微软没有考虑修复。一种可能的解决方法是在 DropDown 事件处理程序中禁用自动完成功能,然后在 DropDownClosed 事件处理程序中重新启用它。

【讨论】:

我讨厌看到人们来 SO 寻找答案,查看该问题的公认答案——这并不能真正解决他们的问题——然后没有答案就离开了。在你成为这些人中的一员之前,用我的名字来看看这个问题的答案……它确实可以轻松彻底地解决这个问题。 查看@JoeGayetty 的答案。 如果微软不考虑修复。人们用什么来代替那个有问题的数据网格视图??【参考方案3】:

我是一名巴西编码专业的学生,​​我在我的项目中浪费了很多时间来修复它。在这里,我在几秒钟内就看到了!!!

我的代码是这样的:

private void populateCombos()
    
        persist.ShowLst(dspMember, vlMember,varTable,lstBox,varWhere);
        persist.ShowLst(dspMember, vlMember,varTable,ddlist1,varWhere);
        persist.ShowLst(dspMember, vlMember,varTable, ddlist2,varWhere);

        ddList1.Text = null;
        ddList2.Text = null;

        lstBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        lstBox.AutoCompleteSource = AutoCompleteSource.ListItems;
        lstBox.Text = null;
    

【讨论】:

【参考方案4】:

添加到/a 按键事件。

    Dim box As ComboBox = sender
    box.DroppedDown = False

【讨论】:

【参考方案5】:

从设计视图中选择 ComboBox 并将“附加”设置为 AutoCompleteMode 属性,这将在不显示窗口的情况下提示该项目。

【讨论】:

【参考方案6】:

这很奇怪。您的代码对我来说看起来不错,我多次使用此 AutoComplete 功能,但它没有同时显示 DropDown 和 AutoComplete 列表。

我的建议是

在显示/值成员之后设置数据源。我不记得为什么,但另一个引起了一些问题。

comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Display";
comboBox1.DataSource = t;

在代码末尾设置 AutoCompleteSource(添加 DataSouce 后)

也许这有帮助。

【讨论】:

这些更改没有任何影响。你能复制问题吗?如果没有,您使用的是什么操作系统?谢谢!【参考方案7】:

要一次只打开一个,您可以使用 comboBox1.Droppeddown = true 打开常规,false 只会出现自动完成

【讨论】:

【参考方案8】:

您只需在集合中添加项目。

现在去组合框的属性选项选择 AutoCompleteSource=列表项 AutocompleteMode=建议

注意:根据您的要求,自动完成源有很多选项 :)

【讨论】:

【参考方案9】:

WinForms ComboBox DropDown...答案是这样... 在comboBox1输入事件中编写以下代码..

private void comboBox1_Enter(object sender, EventArgs e)

    comboBox1.DroppedDown = true;

现在为 comboBox1 自动完成... 在页面加载事件中写下这个AutoComplete()..这样它就可以工作了......

public void AutoComplete()

    try
    
        mysqlConnection conn = new 
        MySqlConnection("server=localhost;database=databasename;user
            id=root;password=;charset=utf8;");
        MySqlCommand cmd = new MySqlCommand("select distinct
            (columnName) from tablename", conn);
        DataSet ds = new DataSet();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        da.Fill(ds, "tablename");
        AutoCompleteStringCollection col = new
        AutoCompleteStringCollection();

        int i = 0;
        for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        
            col.Add(ds.Tables[0].Rows[i]["columnName"].ToString());
        
        comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        comboBox1.AutoCompleteCustomSource = col;
        comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
        if (conn.State == ConnectionState.Open)
        
            conn.Close();
        
    
    catch (Exception ex)
    
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    

【讨论】:

【参考方案10】:

从设计视图中选择 ComboBox 并将 AutoCompleteMode 属性设置为“None”。

【讨论】:

以上是关于WinForms ComboBox DropDown 和 Autocomplete 窗口都出现的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WinForms 的 ComboBox 中居中对齐所选项目?

C# - Winforms - Combobox - 避免选择更新数据源的第一项

winforms DataGridViewComboBoxColumn,设置 DataPropertyName 时 ComboBox 不可点击

覆盖 Winforms ComboBox 自动完成建议规则

C# WinForms ComboBox:AutoComplete 不按降序排序

在 C# .net winforms 中将字典绑定到 ComboBox