Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
KennyPanders
2 / 2 / 0
Регистрация: 21.11.2015
Сообщений: 75
1

Живой поиск по вложению в combobox, загруженный из БД

28.02.2016, 21:08. Просмотров 1870. Ответов 14
Метки нет (Все метки)

Здравствуйте!
Уже достаточно долго не могу решить данный вопрос. Поиск по форуму не привел к желаемым практическим результатам.

Что имеем:
Загружаемый из БД combobox
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            using (SqlConnection cn = new SqlConnection(connStr))                                                                           
            {                                                                                                                               
                string fillOrg = "Select Название from Организации where ID not in (33)";                                                                                                                      
                                                                                                                                            
                DataTable table = new DataTable();                                                                                                                                                                           
                                                                                                                                            
                SqlDataAdapter da = new SqlDataAdapter(fillOrg, cn);                                                                                                                                     
                                                                                                                                            
                da.Fill(table);                                                                                                                                                                                                                  
                                                                                                                                            
                comboBox1.DataSource = table;                                                                                               
                comboBox1.DisplayMember = "Название";                                                                                       
                comboBox1.SelectedIndex = -1;         
}
При вписывании пользователем текста должен происходить живой поиск по вложению в строки cb и выпадать список с подходящими значениями.
Думал, что можно создать массив строк аналогичный строкам из ComBox и работать дальше с ним, но это решение выглядит грубоватым.
Поиск по первым буквам тут не интересует.
Хотелось бы совместными усилиями написать полностью рабочий алгоритм и увековечить его на страницах этой темы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2016, 21:08
Ответы с готовыми решениями:

Живой поиск в comboBox
Здравствуйте! Написал простенький поиск в комбобоксе но при вводе нового...

Возможно ли произвести Живой поиск/Автозаполнение списка ComboBox
Дорогие гуру обращаюсь к Вам за советом по 2 вопросам: 1. В Accese есть...

"Живой" поиск в ComboBox
Доброе время суток! Есть ComboBox, который заполняется из массива Massiv. При...

Живой поиск
Дообрый день! Мое первое сообщение на форуме. Итак, как сделать живой поиск?...

Живой поиск по БД
Всем привет! Не работает живой поиск по БД(PHP+JQuery+MySQL): Файл с формой...

14
AndreyVorobey
153 / 152 / 87
Регистрация: 14.04.2015
Сообщений: 601
29.02.2016, 10:02 2
если правильно понял, попробуй так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DropDown += new EventHandler(comboBox1_DropDown);
}
 
void comboBox1_DropDown(object sender, EventArgs e)
{
    comboBox1.Items.Clear();
    for (int i = 0; i < 10000; i++)
    {
        comboBox1.Items.Add(i);
    }
}
0
insite2012
Модератор
Эксперт .NET
4852 / 3807 / 1094
Регистрация: 12.10.2013
Сообщений: 11,096
Записей в блоге: 2
29.02.2016, 10:29 3
Цитата Сообщение от KennyPanders Посмотреть сообщение
полностью рабочий алгоритм
Алгоритм не совсем ясен.
Допустим, есть combobox со списком (не важно откуда список, не критично).
Надо вводить символы (куда? в этот комбик? куда-то еще?), и нужна фильтрация (какая именно? в комбике с данными? критерии? начальные символы? конечные символы? наличие символов?).
Вот уточните эти вопросы, и будет алгоритм.
0
KennyPanders
2 / 2 / 0
Регистрация: 21.11.2015
Сообщений: 75
29.02.2016, 13:17  [ТС] 4
Так. Объясняю.
Пользователь вводит данные в комбобокс.
Допустим, после того как пользователь ввел 2 и более символа, вываливается список подходящих записей (которые содержат в себе введенные символы), пользователь вводит далее третью букву - список обновляется и отображаются только строки которые содержат в себе эти три буквы итд. После того как пользователь увидит необходимую запись он может выбрать ее и ее значение запишется в комбобокс.

большая часть записей в комбике имеет формат типо ООО "ДомоСтрой", ЗАО "Тех строй" итп
0
AndreyVorobey
153 / 152 / 87
Регистрация: 14.04.2015
Сообщений: 601
29.02.2016, 13:20 5
ты смотрел код, что я скинул?
где ответ о проделанной работе ?
0
KennyPanders
2 / 2 / 0
Регистрация: 21.11.2015
Сообщений: 75
29.02.2016, 13:40  [ТС] 6
AndreyVorobey, в нем нет алгоритма поиска собственно.
А еще всегда когда пытаюсь использовать Clear или add то вылетает исключение: Изменение коллекции элементов невозможно, если задано свойство DataSource"
0
MVK
140 / 132 / 88
Регистрация: 30.03.2011
Сообщений: 531
29.02.2016, 18:47 7
Если правильно понял вопрос, то никаких проблем.
Создай BindingSource (пусть bs). Сделай связку:
C#
1
2
3
bs.DataSource = table; 
comboBox1.DataSource = bs;
comboBox1.DisplayMember = "Название";
Создаешь обработчик TextUpdate бокса и в нем пишешь:
C#
1
2
3
4
5
6
private void comboBox2_TextUpdate(object sender, EventArgs e)
        {
            string fi = "Name LIKE '" + comboBox2.Text + "*'";
            bs.Filter = fi;
            comboBox2.DroppedDown = true;
        }
И все.
Если будешь что-то вводить в ComboBoxе, то список будет ужиматься. Удаляешь-ужимаешь список будет расширяться.
Дерзай.
1
Даценд
Модератор
Эксперт .NET
4161 / 3941 / 2610
Регистрация: 20.04.2015
Сообщений: 7,142
29.02.2016, 21:31 8
KennyPanders,
так можно попробовать:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
BindingSource bs;
private void Form1_Load(object sender, EventArgs e)
{
    using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.connectionString))
    {
        string cmdText = @"select Наименование from Организации";
        OleDbCommand command = new OleDbCommand(cmdText, conn);
        DataTable table = new DataTable();
        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(table);
        comboBox1.DisplayMember = "Наименование";
        bs = new BindingSource();
        bs.DataSource = table;
        comboBox1.DataSource = bs;
        comboBox1.SelectedIndex = -1;
        comboBox1.TextChanged += new EventHandler(comboBox1_TextChanged);
    }
}
 
void comboBox1_TextChanged(object sender, EventArgs e)
{
    comboBox1.DroppedDown = true;
    try
    {
        string filter = comboBox1.Text;
        bs.Filter = "Наименование LIKE '%" + filter + "%'";
        comboBox1.Text = filter;
        comboBox1.Select(filter.Length, 0);
    }
    catch 
    {
        bs.Filter = string.Empty;
    }
}
2
KennyPanders
2 / 2 / 0
Регистрация: 21.11.2015
Сообщений: 75
01.03.2016, 13:26  [ТС] 9
Друзья, спасибо большое. Все работает исправно (а с text_update вообще великолепно)

Только вот один стилистический момент остался.
После ужимания списка область где до этого были надписи нисколько не ужимается.
Скажите, можно ли как то к ней обратиться чтобы сжимать и ее?
0
Миниатюры
Живой поиск по вложению в combobox, загруженный из БД  
KennyPanders
2 / 2 / 0
Регистрация: 21.11.2015
Сообщений: 75
01.03.2016, 13:37  [ТС] 10
Ан, нет не все так гладко.
После первого запуска формы при вводе первой буквы в текст комбика сразу же подставляется первое найденное значение в поле ввода.
Например ввел "К" а он сразу вписал "КЖД" в комбик. Если это "КЖД" стереть и заного начать вписывать, то начинает все хорошо работать, без авто подстановки.

А еще блин, исчезает курсор мыши после выпадания комбика.
0
MVK
140 / 132 / 88
Регистрация: 30.03.2011
Сообщений: 531
02.03.2016, 17:55 11
Что такое ужимание списка?
КЖД. В спмске одно слово на К?
Когда появляется курсор вновь?
0
lemeserg
34 / 23 / 12
Регистрация: 08.04.2013
Сообщений: 266
Завершенные тесты: 1
03.05.2016, 14:47 12
Добрый день! Вот на этой строке
C#
1
comboBox1.TextChanged += new EventHandler(comboBox1_TextChanged);
ошибка "Неоднозначный вызов следующих методов или свойств". Куда уже однозначнее?
Помогите, пожалуйста.

Добавлено через 13 минут
Убрал эту строку, внес код в событие TextUpdate. Идеально.
0
olegchrist
0 / 0 / 0
Регистрация: 23.05.2015
Сообщений: 1
09.10.2016, 12:20 13
KennyPanders, у тебя получилось решить проблему с автоматическим вводом и "ужиманием" списка?
0
KennyPanders
2 / 2 / 0
Регистрация: 21.11.2015
Сообщений: 75
09.10.2016, 15:18  [ТС] 14
Привет, я просто задал статическую длину комбобокса. Например в 7 строк. И это стало выглядеть более приемлемо. Автоматическое взимание не делал.
1
FixFever
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 17
07.12.2016, 12:01 15
Цитата Сообщение от KennyPanders Посмотреть сообщение
Ан, нет не все так гладко.
После первого запуска формы при вводе первой буквы в текст комбика сразу же подставляется первое найденное значение в поле ввода.
Например ввел "К" а он сразу вписал "КЖД" в комбик. Если это "КЖД" стереть и заного начать вписывать, то начинает все хорошо работать, без авто подстановки.
Нашел решение. При обработке события KeyDown выдвигаем шторку с вариантами заполнения. В таком случае комбо-бокс не заполняется первым попавшимся значением. Еще можно дополнительно отключить обработку клавиш смены регистра и навигации, чтобы шторка не опускалась, если пользователь перед вводом решил сменить язык ввода.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
        {
            // Опционально: Не обрабатываем кнопки регистра и навигации
            if ((e.KeyCode == Keys.CapsLock) ||
                (e.KeyCode == Keys.ControlKey) ||
                (e.KeyCode == Keys.Shift) ||
                (e.KeyCode == Keys.ShiftKey) ||
                (e.KeyCode == Keys.Alt) ||
                (e.KeyCode == Keys.Left) ||
                (e.KeyCode == Keys.Right) ||
                (e.KeyCode == Keys.Up) ||
                (e.KeyCode == Keys.Down) ||
                (e.KeyCode == Keys.PageUp) ||
                (e.KeyCode == Keys.PageDown) ||
                (e.KeyCode == Keys.Home) ||
                (e.KeyCode == Keys.End) ||
                // комбинации с шифтом и альтом
                ((e.KeyData & Keys.Alt) == Keys.Alt) || 
                ((e.KeyData & Keys.Shift) == Keys.Shift))
            {
                return;
            }
 
            comboBox1.DroppedDown = true;
        }
0
07.12.2016, 12:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2016, 12:01

Живой поиск
Здравствуйте, мне надо сделать что то типа живого поиска как у google например,...

Живой поиск
Есть 2 поля ввода: &lt;input type=&quot;text&quot; size=&quot;20&quot; value=&quot;&quot; id=&quot;inputString&quot;...

Живой поиск
Сделал живой поиск на сайте. По событию onkeyup выскакивают попытки угадать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru