如何创建自定义自动完成功能,如内置自动完成功能?

how to create a custom AutoComplete function like inbuilt Autocomplete function?

我想创建一个自动完成功能,例如内置的自动完成功能,当我们在组合框的文本编辑器中输入时,会出现一个匹配的建议,如下所示:

我不想使用内置的自动完成模式。 我创建了一个名为集合的 AutoCompleteStringCollection 并用我的数据库数据填充它。 我真的不知道从哪里开始,因为我对编程很陌生,我在互联网上搜索了它,但没有发现任何与之相关的东西。我真的卡住了,请帮忙。

我试过了,但我知道它不会像我想要的那样工作

private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        foreach(string s in collection)
        {
            if (s.Contains(comboBox1.Text))
            {
                comboBox1.Text = s;
            }
        }
    }

您可以试试下面的代码来实现combobox的自动补全功能

      private void Form1_Load(object sender, EventArgs e)
    {
        string[] source = new string[] { "Jack", "Jassie", "Junk", "Jungle" };
        comboBox1.AutoCompleteMode = AutoCompleteMode.Append;
        comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        AutoCompleteStringCollection combData = new AutoCompleteStringCollection();
        combData.AddRange(source);
        comboBox1.AutoCompleteCustomSource = combData;
        comboBox1.Items.AddRange(source);
    }
    int i = 1;
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((this.ActiveControl == comboBox1) && (keyData == Keys.Down))
        {
            if(i%2!=0)
            {
                comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text);
                textBox1.Text = comboBox1.SelectedIndex.ToString();
                i++;
                return true;
            }
            else
            {
                int index = comboBox1.FindStringExact(comboBox1.Text) + 1;
                if(index<comboBox1.Items.Count)
                {
                    comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text) + 1;
                    textBox1.Text = comboBox1.SelectedIndex.ToString();
                    i++;
                    return true;
                }
                else
                {
                  
                    return true;
                }
               
            }
           
            
        }
        else
        {
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }

结果:

int i = 0;
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {

        if ((this.ActiveControl == comboBox1) && keyData == Keys.Down && i == 0)
        {
            
                comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text);
                comboBox1.SelectAll();
                i = 1;
                return true;
        }
        else if((this.ActiveControl == comboBox1) && keyData == Keys.Down && i == 1)
        {
            if (comboBox1.SelectedIndex < comboBox1.Items.Count -1)
            {
                comboBox1.SelectedIndex++;
                comboBox1.SelectAll();
            }
            return true;
        }
        if ((this.ActiveControl == comboBox1) && keyData == Keys.Up && i == 0)
        {
            comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text);
            comboBox1.SelectAll();
            i = 1;
            return true;
        }
        else if((this.ActiveControl == comboBox1) && keyData == Keys.Up && i == 1 )
        {
            comboBox1.SelectedIndex--;
            comboBox1.SelectAll();
            if(comboBox1.SelectedIndex < 0)
            {
                comboBox1.SelectedIndex = 0;
            }
            return true;
        }
        else
        {
            i = 0;
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }