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。我是否以某种方式配置了ComboBox
wrong?
另请注意,使用 KEYBOARD 会使用自动完成下拉菜单。所以上/下箭头键使用的是前窗,而鼠标使用的是后窗。
【问题讨论】:
这有什么问题 - 他们只是想给你两全其美! 有一个简单有效的解决方法。但既然 SO 告诉我不要回答 cmets 中的问题,我不会。但我确实在下面回答了它......作为一个答案。 【参考方案1】:在你的ComboBox
KeyDown
事件中添加一行代码,问题就解决了!
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 不可点击