C # Создание собственного автозаполнения TextBox - PullRequest
2 голосов
/ 06 января 2012

Я хочу создать TextBox, в котором отображается выпадающее меню автозаполнения с некоторыми предложениями.
Конечно, я думал об использовании AutoCompleteCustomSource для моего текстового поля, но проблема в том, что текстовое поле автоматически фильтрует все, что не содержит введенный текст.

Например, если я наберу «listen», мой алгоритм будет использовать «listen (now)», «listen (позже)» и «listen to AAA» в качестве подсказок. Когда я помещаю их в autocompletecustomsource все работает нормально. Но как только я напишу «сейчас», чтобы текст стал «слушать сейчас», выпадающий список автозаполнения становится пустым, потому что ни один из элементов в autocompletecustomsourceource не начинается с «слушать сейчас».

Затем я попытался изменить ввод с текстового поля на комбинированный список, где я поместил свои предложения в свойство Items, а затем просто программно открыл раскрывающийся список. Проблема здесь в том, что первый элемент автоматически выбирается при открытии раскрывающегося списка из кода, а текст первого элемента заменяет введенный текст.

Представьте себе первый пример: когда вы набираете «прослушать», открывается раскрывающийся список с пунктами «прослушать (сейчас)», «прослушать (позже)» и «прослушать AAA». Но текст в выпадающем списке автоматически меняется на первый элемент, поэтому становится «слушай (сейчас)», и ты не можешь набрать что-либо еще.

это код, который я сейчас использую:

    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();
    }

Итак, мой вопрос: как я могу создать текст или комбинированный список, где я могу поместить свои предложения в раскрывающемся списке, без изменения введенного текста и без фильтрации. Я хочу, чтобы все предложения отображались постоянно.

Спасибо за помощь, Алекс

1 Ответ

1 голос
/ 08 марта 2012

Лучше создать новый класс, который наследует поле со списком и переопределить события

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


            base.OnPaint(e);
        }
    }

Я делаю что-то, чтобы изменить отображение ... чтобы поставить сетку, но это давно.

попробуйте поискать по этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...