C#创建自定义自动完成文本框

时间:2012-01-06 18:59:48

标签: c# .net winforms autocomplete custom-controls

我想创建一个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

1 个答案:

答案 0 :(得分:1)

更好的是创建一个新的类,其中包含组合框的herite和覆盖事件

   public class myCombo : ComboBox
    {
        protected override void OnPaint(PaintEventArgs e)
        {


            base.OnPaint(e);
        }
    }

我做了一些事情来改变显示..放置网格,但很久以前。

尝试搜索此内容。