Как сделать поиск массиве и отображение в компоненте 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]);
}
}
}
}
}
Сейчас код не работает:
Это называется автодополнение.
Самый простой вариант: если нужно, чтобы так выбирался один из элементов списка. Его можно реализовать так:
Заполнить элементы списка 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<object>().ToList())
{
comboBox.Items.Remove(item);
}
}
Если исправить ошибки, то можно добиться нужного результата, но лучше и проще использовать стандартное автодополнение.
Есть дефаулт свойства AutoComplete*
Обратите внимание, все это можно реализовать из визуального конструктора, нет необходимости это делать в коде. Код для примера, как работает:
textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection Raccolta = new AutoCompleteStringCollection();
col.Add("Foo");
col.Add("Bar");
textBox1.AutoCompleteCustomSource = Raccolta;
Автокомплит в конструкторе:
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Задеплоил приложение на серверИ при каждом запросе при формирований объекта headers в Request, нет заголовка Authorization который отправляется с клиента
Здраствуйте, не могу сделать SQL-запросМне нужно выбрать столбец film_name из базы данных