Фильтрация ComboBox (C#)
От: Airog Украина  
Дата: 13.02.13 18:00
Оценка:
Есть код типа такого:

ComboBox cb;
cb.ValueMember = "Id";
cb.DisplayMember = "Name";
BindingSource bs = new BindingSource();
bs.DataSource = GetMyTable();
cb.DataSource = bs;


т. е. заполняю список данными через BindingSource

в событии обновления Text делаю фильтрацию:

bs.Filter = "Name='*" + cb.Text + "*'";


т. е. мне нужно чтобы в списке отображались только те строки внутри которых есть то, что ввел юзер в списке.
Но проблема в том что после изменения фильтра автоматически в текстовое поле списка ложится 1-е значение
списка, которое получится после фильтрации, т. е. затирается, то что ввел юзер, в результате вся схема
ломается.

Как можно это исправить? Или может есть другие способы?

П.С. про AutoComplete я в курсе, и в моем случае не подходит, так как там фильтрация идет по начальным
символам, а мне нужны строки содержащие введенный юзером текст
Re: Фильтрация ComboBox (C#)
От: Sinatr Германия  
Дата: 14.02.13 06:50
Оценка:
Здравствуйте, Airog, Вы писали:

A>П.С. про AutoComplete я в курсе, и в моем случае не подходит, так как там фильтрация идет по начальным

A>символам, а мне нужны строки содержащие введенный юзером текст

А нельзя ли эту самую AutoComplete переопределить как-то? Отнаследоваться, перегрузить что-нибудь и использовать свой механизм фильтрации, оставив остальной функционал как есть.
---
ПроГLамеры объединяйтесь..
Re: Фильтрация ComboBox (C#)
От: Codechanger Россия  
Дата: 14.02.13 08:43
Оценка:
Здравствуйте, Airog, Вы писали:

A>Как можно это исправить? Или может есть другие способы?


A>П.С. про AutoComplete я в курсе, и в моем случае не подходит, так как там фильтрация идет по начальным

A>символам, а мне нужны строки содержащие введенный юзером текст

Не совсем уверен, что вам нужен именно ComboBox.
Re: Фильтрация ComboBox (C#)
От: Аноним  
Дата: 14.02.13 09:23
Оценка: 3 (1)
Решил сам данную проблему, и вроде работает как надо. Привожу решение, может кому-то пригодится:

установку фильтра я делаю в событии TextUpdate, это событие возникает только когда юзер что-то вводит, а когда программно меняется свойство Text, то это событие не вызывается, код примерно такой:
private void cbMyComboBox_TextUpdate(object sender, EventArgs e)
{
    string text = cb.Text;
    bs.Filter = "Name LIKE '*" + text + "*'"; //это действие изменяет свойство Text, т. е. затирает то что было введено юзером
    cb.Text = text; //тут восстанавливаем последствия предыдущей строки
    cb.SelectionStart = text.Length;
}

В итоге в раскрываемом списке будут только строки удовлетворяющие фильтру
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.