如何创建自定义自动完成功能,如内置自动完成功能?
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);
}
}
我想创建一个自动完成功能,例如内置的自动完成功能,当我们在组合框的文本编辑器中输入时,会出现一个匹配的建议,如下所示:
我不想使用内置的自动完成模式。 我创建了一个名为集合的 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);
}
}