如何创建自定义自动完成功能,如内置自动完成功能?
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);
【讨论】:
以上是关于如何创建自定义自动完成功能,如内置自动完成功能?的主要内容,如果未能解决你的问题,请参考以下文章