ComboBox DropDownList搜索文本

时间:2014-04-11 23:18:37

标签: c# winforms combobox

我有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设置为任何值时,我收到以下消息:

  

当DropDownStyle为时,只能使用值AutoCompleteMode.None   ComboBoxStyle.DropDownList和AutoCompleteSource不是   AutoCompleteSource.ListItems。

我找到了这个AutoSuggestCombo,但我再次遇到DropDownStyle的问题。

我怎么能:

  1. ComboBox使用DropDownStyle设置为DropDown,但不允许最终用户输入新元素?{/ p>

  2. 能够搜索String的{​​{1}}值的任何部分,而不仅仅是Items样式中当前使用的StartsWith吗? / p>

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

1 个答案:

答案 0 :(得分:2)

您必须将所有自动填充属性设置为无,并自行处理这些内容。 可能有更简单的解决方案,但您可以像这样编写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;

}

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