#c_sharp #winforms
Предположим, есть коллекция или массив значений. Как можно организовать "живой поиск" в comboBox как в поисковой системе google? Спасибо.
Ответы
Ответ 1
Для этого Вам нужно сделать следующее: var values = new AutoCompleteStringCollection(); values.AddRange(ВашаКоллекцияСтрок); _comboBox.AutoCompleteCustomSource = values; _comboBox.AutoCompleteMode = AutoCompleteMode.Suggest; _comboBox.AutoCompleteSource = AutoCompleteSource.CustomSource;Ответ 2
Как-то так: comboBox1.DataSourse=_dt; comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems; Это нужно для фильтрования значений в списке в зависимости от вводимого значения. Еще: http://www.cyberforum.ru/csharp-beginners/thread326296.html Для внимательных: using System; using System.Collections.Generic; using System.Windows.Forms; namespace ListBoxSearch { public partial class Form1 : Form { public Form1() { InitializeComponent(); } ////// Метод,позволяющий организовать поиск в listBox. /// Автор: Umnick /// /// ListBox в котором осуществляется поиск. public void Search(ListBox listBox, Listq) { //Объявление переменных и заполнение их для поиска bool flag = false; List c = new List (); //Колличество совпадений List match = new List ();//Список с совпадениями int n = 0; //Сюда запишем наибольшее кол-во совпадений double p = 0; int count = 0; int index = 0; //Сюда запишем индекс элемента в listbox,в котором найдено наибольшее кол-во совпадений List s = new List ();//будем переписывать все items из listbox сюда for (int i = 0; i < listBox1.Items.Count; i++) //цикл,в нем заполним наши списки { s.Add(listBox.Items[i].ToString());//заполняем items c.Add(0);//заполняем наш счетчик нулями } //Основные циклы по работке с поиском for (int i = 0; i < textBox1.Text.Length; i++)//Цикл,им проходимся по каждому символу в строке поиска { for (int j = 0; j < s.Count; j++)//Цикл,проходимся по каждому item в нашей коллекции,ранее мы переписали туда все items { for (int k = 0; k < s[j].Length; k++)//Цикл,посимвольно перебираем значение каждого items и ищем совпадения. { if (s[j][k] == textBox1.Text[i] || char.ToLower(s[j][k]) == textBox1.Text[i] || char.ToUpper(s[j][k]) == textBox1.Text[i])//Проверка на совпадение.Если один из символов items`а совпал с одним из символов строки поиска,увеличиваем наш счетчик { c[j] = ++c[j];//Увеличиваем счетчик,каждый индекс которого,соответствует каждому items в listBox1. count++; flag = true; } } if (c[j] > n)//Поиск найбольшего счетчика,тоесть items,в котором было обнаружено наибольшее кол-во совпадений. { n = c[j];//... index = j;//Записываем в переменную,индекс,как и говорилось ранее. } } } if (flag) { listBox.Items.Clear(); for (int i = 0; i < c.Count; i++) { p += c[i]; } p /= c.Count; for (int i = 0; i < s.Count; i++) { if (c[i] != 0) { listBox.Items.Add(s[i]); } } } if (!flag) { listBox.Items.Clear(); for (int i = 0; i < q.Count; i++) { listBox.Items.Add(q[i]); } } flag = false; } private void textBox1_TextChanged(object sender, EventArgs e) { Search(listBox1,items);//Вызываем наш метод,и начинаем поиск. } public List items = new List (); private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < listBox1.Items.Count; i++) { items.Add(listBox1.Items[i].ToString()); } } } } Ответ 3
На самом деле все решил попроще. Используется стандартный контрол, при изменении значения выполняется следующий метод: class Class_CleverSearch { public void Search(DataRow[] datarows, //Перечень наименований для отборки int i_max, //Максимальное количество позиций в списке ComboBox cb //ComboBox, значение которое набрано ) //Максимальное количество позиций в списке) { cb.Items.Clear(); int i_kol = 0; foreach (DataRow dr in datarows) { cb.Items.Add(dr[0].ToString()); i_kol++; if (i_kol > i_max) { break; } } cb.DroppedDown = true; //Принудительно раскрываем ComboBox cb.SelectionStart = cb.Text.Length; } }
Комментариев нет:
Отправить комментарий