WinForm ComboBox下拉框带搜索功能

首次发布:2021-12-17 17:21
2022-11-18 修复combobox不存在的字符串时会清空
2022-01-06 更新

效果图如下

方法1

2021-12-20 更新,修复输入不存在的数据源然后点击其他地方会报错

核心代码

//数据源
List<string> data = new List<string>()
{
    "A001",
    "A002",
    "A003",
    "B001",
    "B012",
    "B031",
    "C011",
    "C0121",
    "C01231",
    "C0101",
};

/// <summary>
/// comboBox1文件内容发现改变时 触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cbkeyWords_TextUpdate(object sender, EventArgs e)
{
    //清空combobox
    ComboBox cb = sender as ComboBox;
    cb.Items.Clear();

    //临时存放备查数据
    List<string> temp = new List<string>();

    foreach (var item in data)
    {
        if (item.Contains(cb.Text))
        {
            temp.Add(item);
        }
    }

    if (temp.Count < 1)
    {//修复输入不存在的数据源然后点击其他地方会报错
        cb.Items.Add("");
        cb.SelectionStart = cb.Text.Length;
    }
    else
    {
        try
        {
            //combobox添加已经查到的关键词
            cb.Items.AddRange(temp.ToArray());
            //设置光标位置,否则光标位置始终保持在第一列,造成输入关键词的倒序排列
            cb.SelectionStart = cb.Text.Length;
            //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置。
            Cursor = Cursors.Default;
            //自动弹出下拉框
            cb.DroppedDown = true;
        }
        catch
        {
            cb.SelectedIndex = -1;
        }
    }
}

方法2

今天发现 Combobox有自带查询功能自动提示功能,不过有些功能没实现,如我们在combobox里面搜A001,只能输入A开始才会提示A001,如果输入0开始没不会有A001这个提示,以下是核心代码

this.comboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.comboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
//转载请保留http://www.luofenming.com/show.aspx?id=ART2021121700001