use*_*551 13 c# combobox autocomplete winforms
我正在尝试修改Windows.Forms ComboBox的行为,以便AutoComplete下拉列表根据我指定的规则显示项目.
默认情况下,如果您在ComboBox中使用自动完成,则遵循的规则是"如果(s.StartsWith(userEnteredTextInTheComboBox))下拉列表中包含字符串s"我真正感兴趣的是将新规则替换为当前一,但我找不到任何办法.(具体来说,我更喜欢s.Contains而不是s.StartsWith.)
我可以使用两个控件而不是一个控制器将一个笨拙的解决方案整合在一起,但是我真的很高兴实际上做了我想做的事情.
更新:经过一些搜索,我发现了基本相同的问题.在那里提供的答案表明,使用两个控件"伪造它"是要走的路.
obe*_*obe 18
我遇到了同样的问题,并寻求快速解决方案.
最终我自己写完了.它有点脏,但如果需要它应该不会很难.
我们的想法是在每次按键后重新构建组合列表.这样我们可以依赖于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<object> 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());
}
Run Code Online (Sandbox Code Playgroud)
在 Windows Vista 之前,自动完成对象仅匹配带有前缀的候选者,因此您需要自己编写.
如果需要在建议列表可见时重置建议列表,请使用 IAutoCompleteDropDown::ResetEnumerator。