我想创建一个TextBox,其中自动完成下拉列表会显示一些建议 当然,我想在我的文本框上使用AutoCompleteCustomSource,但问题是,文本框会自动过滤掉所有不包含输入文本的内容。
例如,如果我输入“listen”,我的算法会将“listen(now)”,“listen(later)”和“listen to AAA”视为建议。当我把它们放入autocompletecustomsource时,一切正常。但是一旦我写“现在”以便文本变为“立即收听”,则自动完成下拉列表为空,因为autocompletecustomsource中的所有项目都不以“立即收听”开头。
我接下来尝试的是将输入从文本框更改为组合框,我将我的建议放在Items属性中,然后以编程方式打开下拉列表。这里的问题是,当我从代码打开下拉列表时,第一个项目会自动被选中,第一个项目的文本将替换输入的文本。
想象一下第一个例子:当你输入“listen”时,下拉列表会打开“listen(now)”,“listen(later)”和“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
答案 0 :(得分:1)
更好的是创建一个新的类,其中包含组合框的herite和覆盖事件
public class myCombo : ComboBox
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
}
}
我做了一些事情来改变显示..放置网格,但很久以前。
尝试搜索此内容。