Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

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

#c_sharp #winforms #combobox


Как сделать поиск массиве и отображение в компоненте 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



Это называется автодополнение. Автодополнение из элементов списка Самый простой вариант: если нужно, чтобы так выбирался один из элементов списка. Его можно реализовать так: Заполнить элементы списка Items: Это можно сделать как через конструктор так и через код comboBox1.Items.AddRange(new object[] { "27", "Alex", "Gulynin1", "новый", "сон" }); Установить свойству 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().ToList()) { comboBox.Items.Remove(item); } } Если исправить ошибки, то можно добиться нужного результата, но лучше и проще использовать стандартное автодополнение.

Ответ 2



Есть дефаулт свойства AutoComplete* Обратите внимание, все это можно реализовать из визуального конструктора, нет необходимости это делать в коде. Код для примера, как работает: textBox1.AutoCompleteMode = AutoCompleteMode.Suggest; textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; AutoCompleteStringCollection Raccolta = new AutoCompleteStringCollection(); col.Add("Foo"); col.Add("Bar"); textBox1.AutoCompleteCustomSource = Raccolta; Автокомплит в конструкторе:

Комментариев нет:

Отправить комментарий