Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/47: Рейтинг темы: голосов - 47, средняя оценка - 4.91
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
.NET 4.x

Реализовать в выпадающем списке ComboBox'а поиск по любой части слова

08.01.2013, 18:53. Показов 10581. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Хочу реализовать в выпадающем списке ComboBox'а поиск по любой части слова, а не только с начала.

Столкнулся с такой проблемой:
Есть источник со списком слов,
Например:
Седина-Кузнечная 1
Садовая-Кудринская 2
Садовая-Кудринская 3
Декабристов 36
Ленинградский 7

Вводим в ComboBox одну или несколько букв, к примеру букву "д". В выпадающем списке должны появится слова, в которых есть эта буква.

Сам код поиска я уже написал (самый простой вариант, не суть):
VB.NET
1
2
3
4
5
6
    Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
        ListBox1.Items.Clear() 'список с результатами
        For Each t As String In ListBox2.Items 'список - источник
            If t.ToLower.Contains(ComboBox1.Text.ToLower) Then ListBox1.Items.Add(t)
        Next
    End Sub
Вопрос - как сделать так: (либо как запихнуть результат в имеющийся ComboBox или как сделать свой?)
Название: needCombo.png
Просмотров: 797

Размер: 3.2 Кб
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.01.2013, 18:53
Ответы с готовыми решениями:

Поиск с любой части слова в поле со списком
Добрый день. Как сделать поиск в поле со списком с любой части слова. Например, в списке улиц в базе записано "М.Горького...

Поиск в выпадающем списке
Подскажите можно ли фильстровать выпадающий список?

Поиск в выпадающем списке
Добрый день подскажите можно ли сделать поиск в выпадающем списке на ячейке так , что бы при вводе допустим буквы П происходил поиск из...

23
 Аватар для Gilf
11 / 11 / 0
Регистрация: 27.04.2012
Сообщений: 38
09.01.2013, 13:16
Добавить чуть кода:
VB.NET
1
2
3
4
5
6
7
8
9
10
 Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
        ListBox1.Items.Clear() 'список с результатами
        For Each t As String In ListBox2.Items 'список - источник
            If t.ToLower.Contains(ComboBox1.Text.ToLower) Then 
               ListBox1.Items.Add(t)
               ComboBox1.Items.Add(t)
               ComboBox1.DroppedDown = True
            End If
        Next
    End Sub
И доработать
2
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
09.01.2013, 15:53  [ТС]
Супер! Как-то я не догадался до "DroppedDown = True"
Но пока доработать не получается... тут же появилась новая проблема...
Если не дописывать "DroppedDown = False" - список остаётся развёрнутым (и пустым) при вводе того, чего нет в списке-источнике - смотрится плохо. Попытался дописать так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
        ComboBox1.Items.Clear()
        For Each t As String In tSourceList
            If t.ToLower.Contains(ComboBox1.Text.ToLower) Then
                ComboBox1.Items.Add(t)
                ComboBox1.DroppedDown = True
                Me.Cursor = Cursors.Default 'иначе курсор пропадает..
            Else
                ComboBox1.DroppedDown = False
            End If
            ComboBox1.SelectionStart = ComboBox1.Text.Length 'иначе каретка будет в начале строки
        Next
Но не тут-то было. Он, конечно же, начал закрываться, но теперь его Items'ы сами выбираются и вставляются в .Text !
А так же остаётся открытым вопрос - как выделять введённые символы жирным в списке результатов?
0
 Аватар для Gilf
11 / 11 / 0
Регистрация: 27.04.2012
Сообщений: 38
09.01.2013, 19:49
Мучался мучался и ничего))
Нашёл интересную статью по комбо боксу. В конце страницы есть решение, называется "Search-As-You-Type ComboBox". Но написана на Vb6
Ссылка
Скачать исходник
0
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
10.01.2013, 02:15  [ТС]
Там вроде как говорят только про поиск, который и так сейчас есть в ComboBox - "начинается с .."
А мне то нужно по "содержит" и желательно без регистра...

Добавлено через 5 часов 40 минут
Проблему с закрытием решил, в целом работает, но авто-вставку не победил и авто-выделение тоже, а мешает сильно. Придётся идти другим путём.
Почти нормально работающий ComboBox со поиском:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
        Me.Cursor = Cursors.Default ' чтоб не исчезал курсор
        ComboBox1.Items.Clear()
 
        If ComboBox1.Text = "" Then ' исправление ошибки при выборе "ничего"
            ComboBox1.Items.Add("")
            ComboBox1.DroppedDown = False
            Exit Sub
        End If
 
        For Each t As String In tSourceList 'список - источник
            If t.ToLower.Contains(ComboBox1.Text.ToLower) Then
                ComboBox1.Items.Add(t)
            End If
            ComboBox1.SelectionStart = ComboBox1.Text.Length
        Next
 
        If ComboBox1.Items.Count > 0 Then
            ComboBox1.DroppedDown = True
        Else
            ComboBox1.Items.Add("")
            ComboBox1.DroppedDown = False
        End If
End Sub
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
10.01.2013, 10:42
Цитата Сообщение от MLF Посмотреть сообщение
Придётся идти другим путём. Создал тему: Создание своего ComboBox
Ну да, я понимаю это на много легче чем это:
VB.NET
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
    Dim Index As Integer = 0
 
    Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
        ComboBox1.Items.Clear()
        Index = 0
 
        For Each t As String In tSourceList
            Me.Cursor = Cursors.Default
            If ComboBox1.Text.Length > 0 Then
                If t.ToLower.Contains(ComboBox1.Text.ToLower) Then
                    ComboBox1.DroppedDown = True
                    Index = ComboBox1.Text.Length
                    ComboBox1.Items.Add(t)
                Else
                    Index = ComboBox1.Text.Length
                End If
            Else
                ComboBox1.SelectionStart = Index
                ComboBox1.Items.Add("")
                ComboBox1.DroppedDown = False
                ComboBox1.SelectionStart = Index
                Exit Sub
            End If
        Next
        ComboBox1.SelectionStart = Index
    End Sub
1
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
10.01.2013, 12:58  [ТС]
Цитата Сообщение от Hennasy Посмотреть сообщение
Ну да, я понимаю это на много легче чем это:
Эм... работает!
Если не затруднит - объясни плз, почему у меня было так криво?
желательно прям по строчкам - где ошибки и в чём они... можно в приват, если это оффтопом будет. Оч интересно!

А по теме: есть ли какая-нибудь возможность сделать выделение "жирным", как на картинке из первого поста?
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
10.01.2013, 13:31
Ну у тебя тоже бы работало если бы было так:
VB.NET
1
2
3
4
5
6
7
        For Each t As String In tSourceList
            If t.ToLower.Contains(ComboBox1.Text.ToLower) Then
                ComboBox1.DroppedDown = True
                ComboBox1.Items.Add(t)
            End If
            ComboBox1.SelectionStart = ComboBox1.Text.Length
        Next
Цитата Сообщение от MLF Посмотреть сообщение
есть ли какая-нибудь возможность сделать выделение "жирным", как на картинке из первого поста?
Тут уже подсказать не могу).
0
55 / 55 / 5
Регистрация: 17.09.2012
Сообщений: 128
10.01.2013, 13:39
Цитата Сообщение от MLF Посмотреть сообщение
А по теме: есть ли какая-нибудь возможность сделать выделение "жирным", как на картинке из первого поста?
возможно поможет решение, приведённое в теме
1
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
11.01.2013, 00:04  [ТС]
Hennasy, Короч весь вечер парился с твоим и своим кодом и нифига толком не понял. Ну да ладно. Остаток вечера пытался победить лишний "хвост" ComboBox'а остающийся при уменьшении списка результатов. Помоги решить плз)

Цитата Сообщение от madgun Посмотреть сообщение
возможно поможет решение, приведённое в теме
Посмотрел, интересно конечно, но курить ещё и отрисовку вручную уж сил нет) Это не столь критично - оставлю пока так.
0
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
14.01.2013, 17:40  [ТС]
Если кому-нибудь интересно в чём был секрет (вдруг я не один такой тупой), то строка:
VB.NET
1
ComboBox1.DroppedDown = True
Должна идти ДО добавления элементов в список, а не после. Наоборот работает криво. Как изменить убрать лишний "хвост" у выпадающего списка - пока так и не понял.
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
14.01.2013, 18:20
Пару вариантов:
1. Меняет ширину до 3-х итемов.
VB.NET
1
ComboBox1.DropDownHeight = (ComboBox1.ItemHeight + 1) * 3
2. Посмотри в свойствах MaxItem иди DropMaxItem вроде что то было.
0
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
14.01.2013, 18:51  [ТС]
Hennasy,
Это я нашёл, но не получается менять высоту списка динамически (т.е. когда он открыт).
Суть фильтра ведь в том, что по мере ввода букв - список сокращается. Список самих элементов становится меньше, а поле выпадающего списка остаётся первоначальных размеров. Если же свернуть его и развернуть снова - произойдёт выбор элемента, а это ненужно...

Вот код - как оно работает на данный момент (вдруг я где накосячил...) :
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    Dim Index As Integer = 0
    Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
        ComboBox1.Items.Clear()
        Index = 0
        For Each t As String In tSourceList
            If t.ToLower <> ComboBox1.Text.ToLower Then 'иначе нельзя выбрать элемент
                If ComboBox1.Text.Length > 0 Then
                    If t.ToLower.Contains(ComboBox1.Text.ToLower) Then
                        ComboBox1.DroppedDown = True
                        ComboBox1.Items.Add(t)
                    End If
                    Index = ComboBox1.Text.Length
                Else
                    AllLoad_CB() 'сброс списка в изначальное состояние со всеми элементами
                    ComboBox1.DroppedDown = False
                    ComboBox1.SelectionStart = Index
                    Exit Sub
                End If
            End If
        Next
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
14.01.2013, 20:21
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ну вот полный бред конечно но работает хоть как то, просто написал чтобы ты смысл понял):
VB.NET
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    Dim Index As Integer = 0
    Dim tSourceList() As String = {"Седина-Кузнечная 1", "Садовая-Кудринская 2", "Садовая-Кудринская 3", "Декабристов 36", "Ленинградский 7"}
    Dim NewList As List(Of String) = New List(Of String)
    Dim Test As List(Of String) = New List(Of String)
 
    Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
        ComboBox1.Items.Clear()
        NewList.Clear()
 
        For Each t As String In tSourceList
            If ComboBox1.Text.Length > 0 Then
                If t.ToLower.Contains(ComboBox1.Text.ToLower) Then
                    NewList.Add(t)
                    Index = ComboBox1.Text.Length
                Else
                    Index = ComboBox1.Text.Length
                End If
            Else
                NewList.Clear()
            End If
        Next
        ComboBox1.DropDownHeight = (ComboBox1.ItemHeight) * (NewList.Count) + 2
        If NewList.Count <= 0 Then
            ComboBox1.Items.Add("")
            ComboBox1.DroppedDown = False
            ComboBox1.SelectionStart = Index
        Else
            If IdentityList(NewList, Test) = True Then
                ComboBox1.SelectionStart = Index
                Cursor = Cursors.Default
                For i = 0 To NewList.Count - 1 Step 1
                    ComboBox1.DroppedDown = True
                    ComboBox1.Items.Add(NewList(i))
                    ComboBox1.SelectionStart = Index
                Next
            Else
                Test.Clear()
                For i = 0 To NewList.Count - 1 Step 1
                    Test.Add(NewList(i))
                Next
                ComboBox1.Items.Add("")
                ComboBox1.DroppedDown = False
                ComboBox1.Items.Clear()
                ComboBox1.SelectionStart = Index
                For i = 0 To NewList.Count - 1 Step 1
                    ComboBox1.DroppedDown = True
                    ComboBox1.Items.Add(NewList(i))
                    ComboBox1.SelectionStart = Index
                Next
                Cursor = Cursors.Default
            End If
        End If
    End Sub
 
    Function IdentityList(ByVal List1 As List(Of String), ByVal List2 As List(Of String)) As Boolean
        IdentityList = True
        If List1.Count - 1 = List2.Count - 1 Then
            For i = 0 To List1.Count - 1 Step 1
                If List1(i) <> List2(i) Then
                    Return False
                End If
            Next
        Else
            Return False
        End If
    End Function
2
27 / 27 / 4
Регистрация: 14.02.2012
Сообщений: 135
16.01.2013, 05:41  [ТС]
ага, понял, спасиб)
А ведь ларчик просто открывался... и как я сам не додумался. как будет время - будем тестить и допиливать дальше)
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
20.10.2016, 11:43
MLF, Jason, Добрый день! Несовсем понимаю, а как отловить сам выбор то?
через
VB.NET
1
ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
дважды выскакиевает пустое окно, на
VB.NET
1
MsgBox(ComboBox1.Text)
Хотя в режиме отладки, он видно, что во время события,
VB.NET
1
ComboBox1.Text
Имеет выбранный текст.

Добавлено через 10 минут
Сделал так.

VB.NET
1
2
3
4
5
6
    Private Sub ComboBox1_SelectedValueChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedValueChanged
        If ComboBox1.Text <> "" Then
            Clipboard.SetText(ComboBox1.Text)
            ComboBox1.DroppedDown = False
        End If
    End Sub
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
20.10.2016, 15:53
есть у текстбоксов встроеная фишка, но она ищет по началу строки а не где-то в тексте:
VB.NET
1
2
3
4
5
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        TextBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend
        TextBox1.AutoCompleteSource = AutoCompleteSource.CustomSource
        TextBox1.AutoCompleteCustomSource.AddRange(ListBox1.Items.Cast(Of String).ToArray)
    End Sub
Миниатюры
Реализовать в выпадающем списке ComboBox'а поиск по любой части слова  
0
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
20.10.2016, 17:13
Yury Komar, Ну с начала это понятно.Я сейчас пытаюсь найти готовое решение, по всему решению. Выше изложенный вариант бросил, т.к. не совсем врубаюсь что к чему там, а работает он коряво.
Как можно используя бд и один комбобокс сделать фильтр на столбик? Может в этой стязи подумать...
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
20.10.2016, 17:24
ctac1412, ну просто создавать массив на основе данных вашего "столбика", и уже его привязывать как источник данных ждя отображения подсказки при вводе. Тоесть его перебирать на наличие текста, введенного в текстбокс или комбобокс...

Добавлено через 2 минуты
можно пробегать это массив и формировать TextBox1.AutoCompleteCustomSource динамически, тем самым выдавая результаты строк, к которых встречается введенный текст, причем в любом месте.
1
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
21.10.2016, 10:13
Yury Komar, А как получить результат наличие текста? Что бы не придумывать велосипед. Есть же наверное родной метод который ищет вхождение во всем тексте? ( я сейчас без студии) предположу что это -
VB.NET
1
Contains
??? он выдает true or false?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2016, 10:13
Помогаю со студенческими работами здесь

Реализовать функцию выбранной даты рождения в выпадающем списке
Всем доброго времени суток! Скажите, как реализовать функцию выбранной даты рождения в выпадающем списке? &lt;?php $monthOptions =...

Реализовать вывод данных из MySQL таблицы в выпадающем списке
Приветствую, уважаемые форумчане. Возникла проблема. Хочу реализовать вывод данных из mysql таблицы в выпадающем списке, для этого...

Поиск по алфавиту в выпадающем списке
Нужен пример кода. Нужно нечто похожее на выпадающий список. То есть текстовое окно + раскрывающийся список. К примеру список городов. ...

Посимвольный поиск в выпадающем списке
Добрый вечер, подскажите как правильно искать значения в списке по мере ввода символов?Private Sub идИзд_Change() Dim f f =...

Реализовать выпадающий список, содержимое которого зависит от выбора в другом выпадающем списке
Здравствуйте, мне нужен выпадающий список. ( можно на HTML ) Человек выбирает в 1 выпадающем списке Mersedes и во втором выпадающем...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru