#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
Комментариев нет:
Отправить комментарий