Как сделать поиск массиве и отображение в компоненте ComboBox?

140
13 января 2020, 20:10

Как сделать поиск массиве и отображение в компоненте ComboBox? По примеру поисковика Google.

Код:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
    comboBox1.DataSource = null;
    comboBox1.Items.Clear();
    if ((e.KeyValue >= 34 && e.KeyValue <= 175))
    {
        string[] WRT1 = new string[] { "27", "Alex", "Gulynin1", "новый","сон"};
        string[] arr = new string[WRT1.Length];
        string str;
            if (comboBox1.Text != "")
            {
                for (int i = 0; i < WRT1.Length; i++)
                {
                    str = WRT1[i];
                    if (str.IndexOf(comboBox1.Text) != -1)
                    {
                        comboBox1.Items.Add(WRT1[i]);
                    }
                }
            }
        }
    }

Сейчас код не работает:

  1. только со второго символа находит;
  2. при нажатии клавиши отзеркаливается текст
Answer 1

Это называется автодополнение.

Автодополнение из элементов списка

Самый простой вариант: если нужно, чтобы так выбирался один из элементов списка. Его можно реализовать так:

  1. Заполнить элементы списка Items:

    Это можно сделать как через конструктор так и через код

comboBox1.Items.AddRange(new object[] {
            "27",
            "Alex",
            "Gulynin1",
            "новый",
            "сон"
});
  1. Установить свойству AutoCompleteMode значение SuggestsAppend (предлагать и дополнять), а свойству AutoCompleteSourse значение ListItems (выбирать из элементов списка).
comboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
comboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;

В результате получим:

Автодополнение из другого списка

Если нужно, чтобы в самом выпадающем списке был один набор элементов, а в автодополнении другой, то можете воспользоваться свойством AutoCompleteSource. Такое поведение может понадобится если Ваш список поддерживает добавление новых элементов, например.

comboBox1.AutoCompleteCustomSource.AddRange(new string[] {
            "27",
            "Alex",
            "Gulynin1",
            "новый",
            "сон"});
//и заполняем соответствующие свойства
comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

В результате получится похожее поведение:

Добавление в список

Теперь можно по нажатию Enter добавлять выбранные элементы в выпадающий список ComboBox:

private void comboBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                var newString = comboBox1.Text;
                if (!comboBox1.Items.Contains(newString))
                {
                    comboBox1.BeginUpdate();
                    comboBox1.Items.Add(newString);
                    comboBox1.EndUpdate();
                }
            }
        }

Ошибки

только со второго символа находит;

Это происходит потому что событие KeyDown выполняется сразу при нажатии на клавишу (например, A) еще до того как обновился текст. Т.о. в обработчике событий при нажатии «A» текст еще пустой и это условие не срабатывает:

if (comboBox1.Text != "")

Для того чтобы это исправить можете вместо события KeyDown обрабатывать событие TextChanged и уже не обрабатывать клавиши, а сразу действовать в зависимости от набранного текста.

при нажатии клавиши отзеркаливается текст

Это происходит из-за того что при очистке списка

comboBox1.Items.Clear();

курсор автоматически устанавливается в начало строки. Этого можно избежать если для очистки использовать следующий метод (источник):

public static void SafeClearItems(ComboBox comboBox)
    {
        foreach (var item in comboBox.Items.Cast<object>().ToList())
        {
            comboBox.Items.Remove(item);
        }
    }

Если исправить ошибки, то можно добиться нужного результата, но лучше и проще использовать стандартное автодополнение.

Answer 2

Есть дефаулт свойства AutoComplete*

Обратите внимание, все это можно реализовать из визуального конструктора, нет необходимости это делать в коде. Код для примера, как работает:

textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection Raccolta = new AutoCompleteStringCollection();
col.Add("Foo");
col.Add("Bar");
textBox1.AutoCompleteCustomSource = Raccolta;

Автокомплит в конструкторе:

READ ALSO
Комментируется любой php код как исправить?

Комментируется любой php код как исправить?

Подскажите пожалуйстаИнспектирую элемент

167
Ссылки из меню wordpress

Ссылки из меню wordpress

Есть ли возможность получить урлы произвольных ссылок из меню?

155
symfony не принимает произвольный header

symfony не принимает произвольный header

Задеплоил приложение на серверИ при каждом запросе при формирований объекта headers в Request, нет заголовка Authorization который отправляется с клиента

134
Fatal error: Uncaught Error: Call to a member function query() on null

Fatal error: Uncaught Error: Call to a member function query() on null

Здраствуйте, не могу сделать SQL-запросМне нужно выбрать столбец film_name из базы данных

160