【问题标题】:WinForms ComboBox DropDown and Autocomplete window both appearWinForms ComboBox DropDown 和 Autocomplete 窗口都出现
【发布时间】: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";

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

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

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

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

【问题讨论】:

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

标签: c# winforms combobox autocomplete


【解决方案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”。

              【讨论】:

                猜你喜欢
                • 2010-11-04
                • 1970-01-01
                • 2011-03-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-03-03
                • 2019-02-12
                相关资源
                最近更新 更多