Есть код типа такого:
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 я в курсе, и в моем случае не подходит, так как там фильтрация идет по начальным
символам, а мне нужны строки содержащие введенный юзером текст
Решил сам данную проблему, и вроде работает как надо. Привожу решение, может кому-то пригодится:
установку фильтра я делаю в событии 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;
}
В итоге в раскрываемом списке будут только строки удовлетворяющие фильтру