C#创建自定义自动完成文本框
本文关键字:文本 创建 自定义 | 更新日期: 2023-09-27 18:19:35
我想创建一个TextBox,其中显示一个自动完成下拉列表,其中包含一些建议
当然,我想过在我的文本框中使用AutoCompleteCustomSource,但问题是,文本框会自动过滤所有不包含输入文本的内容。
例如,如果我键入"listen",我的算法会将"listen(now)"、"listend(later)"answers"listen to AAA"作为建议。当我把它们放在autocompletecustomsource中时,一切都很好。但是,一旦我写下"现在",使文本变为"立即收听",自动完成下拉列表就会为空,因为自动完成自定义源中没有任何项目以"立即收听(listen now)"开头。
我接下来尝试的是将输入从文本框更改为组合框,将我的建议放在Items属性中,然后以编程方式打开下拉列表。这里的问题是,当我从代码中打开下拉列表时,第一个项目会被自动选中,第一个项的文本会替换输入的文本。
想象一下第一个例子:当您键入"listen"时,下拉列表会打开,其中包含"listen(now)"、"listen(later)"answers"listen to AAA"。但是组合框中的文本会自动更改为第一项,因此变为"listen(now)",并且您不能键入其他内容。
这是我现在使用的代码:
private void comboBox2_KeyUp(object sender, KeyEventArgs e)
{
string asd = comboBox2.Text;
if (asd.Length < 3)
return;
if (e.KeyCode == Keys.Enter)
{
OpenItem(asd);
return;
}
if (AllToString(comboBox2.Items).Contains(asd))
{
return;
}
DateTime started = DateTime.Now;
System.Threading.Thread tth = new System.Threading.Thread((System.Threading.ThreadStart)delegate()
{
JsonData dat = new JsonData();
//Query autocomplete
...
//End Query
comboBox2.Invoke((MethodInvoker)delegate()
{
if (comboBox2.Tag == null || ((DateTime)comboBox2.Tag) < started)
{
comboBox2.Items.Clear();
comboBox2.Items.AddRange(li.ToArray()); //li is the list of suggestions
comboBox2.Select(comboBox2.Text.Length, 0);
comboBox2.Tag = started;
if (li.Count != 0)
comboBox2.DroppedDown = true;
else
{
comboBox2.Focus();
comboBox2.Select(comboBox2.Text.Length, 0);
}
}
});
});
tth.IsBackground = false; tth.Start();
}
因此,我的问题是:如何创建一个文本或组合框,在不更改输入的文本和不进行筛选的情况下,将我的建议放在下拉列表中。我希望所有的建议都能一直显示出来。
感谢您的帮助,Alex
最好创建一个继承组合框并覆盖事件的新类
public class myCombo : ComboBox
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
}
}
我做了点什么来改变显示器。。设置网格,但这是很久以前的事了。
尝试对此进行搜索。