【问题标题】:how to create a custom AutoComplete function like inbuilt Autocomplete function?如何创建自定义自动完成功能,如内置自动完成功能?
【发布时间】:2021-06-24 01:33:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 使用第三方组件(如 devexpress)的最简单方法。
  • @jvnd 我是一名学习者,无法负担 devexpress 服务。

标签: c# windows visual-studio winforms ado.net


【解决方案1】:

你可以试试下面的代码来实现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);
        }
    }

结果:

【讨论】:

  • 谢谢我想当我输入“ja”时自动完成显示第一个可能的匹配“jack”,当我按下 downKey 键时它不应该移动到下一个匹配“jassie”但它应该选择“jack”作为选定的索引,然后当我再次按下箭头键时,它应该在“jack”索引之后选择下一个索引,但在我的情况下,当我按下箭头键时,自动完成保持选择“ja”并搜索下一个匹配以“ja”开头。如果您不使用自动完成并输入“ja”,它不会提示任何内容,但是当您按下 downKey 时,它会选择“jack”。我想要同样的功能,但它应该建议“杰克”。
  • @prashant,我已根据您的要求更新了我的代码,请检查它是否适合您。
  • 非常感谢您的帮助。我对代码做了一些调整,现在它就像我想要的那样工作。我正在回答我所做的。再次感谢。
【解决方案2】:
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);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多