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

我正在尝试修改Windows.Forms ComboBox的行为,以便AutoComplete下拉列表根据我指定的规则显示项目。

默认情况下,如果在ComboBox中使用自动完成,则遵循的规则是“如果(s.StartsWith(userEnteredTextInTheComboBox)),则下拉列表中包含字符串s”我真正感兴趣的是将新规则替换为当前一,但我找不到任何办法。 (具体来说,我更喜欢s.Contains而不是s.StartsWith。)

我可以使用两个控件而不是一个控制器来组合一个笨拙的解决方案,但我真的很高兴能够实现我想要的一个。

更新:经过一番搜索,我发现基本上是同一个问题 。 在那里提供的答案表明,使用两个控件来“伪造它”是要走的路。

我遇到了同样的问题,并寻求快速解决方案。

最终我自己写完了。 它有点脏,但如果需要的话,它应该不会让它变得更漂亮。

我们的想法是在每次按键后重新构建组合列表。 这样我们可以依赖于combo的内置接口,我们不需要用文本框和列表框来实现我们自己的接口……

如果重新构建组合选项列表,请记住将combo.Tag设置为null

 private void combo_KeyPress(object sender, KeyPressEventArgs e) { comboKeyPressed(); } private void combo_TextChanged(object sender, EventArgs e) { if (combo.Text.Length == 0) comboKeyPressed(); } private void comboKeyPressed() { combo.DroppedDown = true; object[] originalList = (object[])combo.Tag; if (originalList == null) { // backup original list originalList = new object[combo.Items.Count]; combo.Items.CopyTo(originalList, 0); combo.Tag = originalList; } // prepare list of matching items string s = combo.Text.ToLower(); IEnumerable newList = originalList; if (s.Length > 0) { newList = originalList.Where(item => item.ToString().ToLower().Contains(s)); } // clear list (loop through it, otherwise the cursor would move to the beginning of the textbox...) while (combo.Items.Count > 0) { combo.Items.RemoveAt(0); } // re-set list combo.Items.AddRange(newList.ToArray()); } 

在Windows Vista之前,自动完成对象仅匹配具有前缀的候选对象,因此您需要自己做饭 。

如果需要在可见时重置建议列表,请使用IAutoCompleteDropDown :: ResetEnumerator 。