WinForms ComboBox DropDown和Autocomplete窗口都会出现

时间:2010-06-17 19:07:39

标签: c# winforms combobox autocomplete

我在这个代码的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";

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

  1. 点击ComboBox下拉按钮 - 显示项目列表,然后选择ComboBox
  2. 中的文字
  3. 键入'5','1'...即我希望使用自动填充功能搜索515,516等。
  4. 您会看到自动完成窗口现在显示在下拉列表的顶部。但是,如果我将鼠标移过,它就是自动完成窗口后面的模糊下拉窗口,它接收鼠标事件,包括点击。所以我想我点击一个自动完成的项目,但实际上点击了一些我看不到的完全随机的东西。
  5. 这是ComboBox中的错误吗?如果重要的话,我正在使用Windows 7。我是否以某种方式配置了ComboBox错误?

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

    enter image description here

10 个答案:

答案 0 :(得分:23)

ComboBox KeyDown事件中添加一行代码,问题就解决了!

private void comboBox_NameAndID_KeyDown(object sender, KeyEventArgs e)
{
    comboBox_NameAndID.DroppedDown = false;
}

Source

答案 1 :(得分:20)

通过设置PropertyGrid中的属性,没有问题为此获得repro。在Win7和Windows XP中都采用这种方式。

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

答案 2 :(得分:2)

我是巴西的编码学生,我在项目中失去了很多时间来修复它。在这里,我在几秒钟内看到了它!

我的代码看起来像这样:

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;
    }

答案 3 :(得分:1)

添加到/ a按键事件。

    Dim box As ComboBox = sender
    box.DroppedDown = False

答案 4 :(得分:0)

那是我们的。您的代码看起来很好,我多次使用自动完成功能,但它没有同时显示DropDown和自动完成列表。

我的建议是

  • 在显示/值成员之后设置DataSource。我不记得为什么,但另一方造成了一些问题。

    comboBox1.ValueMember = "ID";
    comboBox1.DisplayMember = "Display";
    comboBox1.DataSource = t;
    
  • 在代码末尾设置AutoCompleteSource(添加DataSouce后)

也许这有帮助。

答案 5 :(得分:0)

一次只能打开一个你可以使用comboBox1.Droppeddown = true打开常规,false只显示自动完成

答案 6 :(得分:0)

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

现在选择组合框的属性选项 AutoCompleteSource =时listItems AutocompleteMode =建议

注意:自动完成源根据您的要求有多种选择:)

答案 7 :(得分:0)

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);
    }
}

答案 8 :(得分:0)

从设计视图中选择ComboBox并设置&#34;无&#34;到AutoCompleteMode属性。

答案 9 :(得分:0)

从设计视图中选择ComboBox,并将“Append”设置为AutoCompleteMode属性,这将建议不使用窗口的项目。