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

Posted

技术标签:

【中文标题】如何创建自定义自动完成功能,如内置自动完成功能?【英文标题】: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 服务。 【参考方案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);
        
    

【讨论】:

以上是关于如何创建自定义自动完成功能,如内置自动完成功能?的主要内容,如果未能解决你的问题,请参考以下文章

在 Microsoft Access 数据表上自定义自动完成功能

Notepad++ 自定义语言调用提示自动完成

ios中使用monotouch的自动完成选项的自定义列表

Excel,自定义自动填充功能

自动完成 Google Map V3 无法自定义的地方?

探索SwipeRefreshLayout配合自定义ListView完成下拉刷新滑到底部自动加载更多