如何获取自动完成功能,不仅要搜索其开头,还要使用包含,例如包含“门”

问题描述

使用自动完成功能,您可以搜索开头,并且效果很好。但是,搜索到的字符串并不总是以您要查找的字符串开头。例如,从我添加的包含字符串的字典中。

门打开元件
外门
内门
推拉门

仅门的打开元素从自动完成搜索中返回。

这是我用来填充自动完成功能代码...

        Dictionary<string,string> items = KN_File.CreateDictFromTextFile(filePath);
        List<string> treeBasedList = new List<string>();

        foreach (keyvaluePair<string,string> kvp in items)
        {
            treeBasedList.Add(kvp.Value + "," + kvp.Key);
        }

        AutoCompleteStringCollection AutoCompleteList = new AutoCompleteStringCollection();
        AutoCompleteList.AddRange(treeBasedList.ToArray());
        comboBx.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        comboBx.AutoCompleteSource = AutoCompleteSource.CustomSource;
        comboBx.AutoCompleteCustomSource = AutoCompleteList;

解决方法

这是您可以参考的解决方法。

private void Form1_Load(object sender,EventArgs e)
{
    listOriginal.Add("Doors opening elements");
    listOriginal.Add("exterior doors");
    listOriginal.Add("interior doors");
    listOriginal.Add("sliding doors");

    this.comboBx.Items.AddRange(listOriginal.ToArray());
}

// Bind default keywords
List<string> listOriginal = new List<string>();
// save new keywords
List<string> listNew = new List<string>();

private void comboBx_TextUpdate(object sender,EventArgs e)
{
    //clear combobox
    this.comboBx.Items.Clear();
    //clear listNew
    listNew.Clear();
    foreach (var item in listOriginal)
    {
        // call ToLower() .. not case sensitive
        if (item.ToLower().Contains(this.comboBx.Text))
        {
            //add to ListNew
            listNew.Add(item);
        }
    }
    this.comboBx.Items.AddRange(listNew.ToArray());
    this.comboBx.SelectionStart = this.comboBx.Text.Length;
    Cursor = Cursors.Default;
    // Automatically pop up drop-down
    this.comboBx.DroppedDown = true;
}

测试结果,

enter image description here