组合框下拉列表搜索文本

本文关键字:文本 搜索 下拉列表 组合 | 更新日期: 2023-09-27 17:58:02

我有一个ComboBox DataSource属性设置为此Type的列表:

public class ListInfo
{
    public int Key { get; set; }
    public string Name { get; set; }
}

DropDownStyle设置为DropDownList,我将AutoCompleteSource设置为ListItems,将AutoCompleteMode设置为SuggestAppend

经过一些测试后,客户端回来并要求能够找到文本值的任何部分,而不仅仅是从文本的开头。我见过的大多数示例都是在DropDownStyle设置为 DropDown 时执行此操作的,我无法这样做,因为用户无法编辑列表的内容,只需选择一个值。

我尝试创建一个CustomSource,但是当我尝试将AutoCompleteMode设置为任何值时,我收到以下消息:

只有值 AutoCompleteMode.None 可以在 DropDownStyle 为 ComboBoxStyle.DropDownList 和 AutoCompleteSource 不是 AutoCompleteSource.ListItems.

我找到了这个自动建议组合,但我再次遇到了DropDownStyle的问题。

我怎样才能:

  1. 使用DropDownStyle设置为 DropDownComboBox,不允许最终用户输入新元素?

  2. 能够搜索Items String值的任何部分,而不仅仅是当前在DropDownList样式中使用的StartsWith

这是开始使用 Rx 的机会,还是该路线是一个臃肿的解决方案和随之而来的学习曲线?(到目前为止使用简单的教程(

组合框下拉列表搜索文本

您必须将所有自动完成属性设置为 none 并自行处理这些内容。可能有更简单的解决方案,但您可以像这样编写 KeyPress 事件。

private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    SortedDictionary<int, ListInfo> dict = new SortedDictionary<int, ListInfo>();
    int found = -1;
    int current = comboBox1.SelectedIndex;
    // collect all items that match:
    for (int i = 0; i < comboBox1.Items.Count; i++)
        if (((ListInfo)comboBox1.Items[i]).Name.ToLower().IndexOf(e.KeyChar.ToString().ToLower()) >= 0)
        // case sensitive version:
        // if (((ListInfo)comboBox1.Items[i]).Name.IndexOf(e.KeyChar.ToString()) >= 0)
                dict.Add(i, (ListInfo)comboBox1.Items[i]);
    // find the one after the current position:
    foreach (KeyValuePair<int, ListInfo> kv in dict)
             if (kv.Key > current) { found = kv.Key; break; }
    // or take the first one:
    if (dict.Keys.Count > 0 && found < 0) found = dict.Keys.First();
    if (found >= 0) comboBox1.SelectedIndex = found;
    e.Handled = true;
}

您可以决定是否要区分大小写;可能不需要。