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

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

最好创建一个继承组合框并覆盖事件的新类

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

            base.OnPaint(e);
        }
    }

我做了点什么来改变显示器。。设置网格,但这是很久以前的事了。

尝试对此进行搜索。