2016-02-22 9 views
3

Я прочитал с листа первенствовать и написал для BindingList, в Form_Load это устанавливается в DataSource как BindingSource:фильтр BindingSource, когда DataSource является BindingList

bd = new BindingSource(); //instance of BindingSource 
bd.DataSource = ExcelOPS.LerExcel(); //LerExcel() method return a BindingList<T> 

gvFiltro.DataSource = bd; //set a DataGridView named gvFiltro DataSource property 
bindNav.BindingSource = bd; //set a BindingNavigator source 

Эта работа хорошо! я намерен создать выпадающий в качестве фильтра для этого DataGridView gvFiltro, поэтому в SelectedIndexChanged случае выпадающий список, я стараюсь это:

this.gvFiltro.DataSource = null; 
bd.Filter = string.Format("TAG_FAZENDA like '%{0}%'", cbTagFaz.Text); 
gvFiltro.DataSource = bd; 
gvFiltro.Update(); 
gvFiltro.Refresh(); 

bindNav.BindingSource = bd; 
bindNav.Update(); 
bindNav.Refresh(); 

Но DataGridView не изменится. Я что-то пропустил?

+0

Если datagrid находится в другом контейнере, вам может понадобиться обновить этот элемент управления. –

+0

Нужно обновить форму? –

ответ

3

Невозможно использовать Filter property, чтобы отфильтровать BindingSource, что соответствует DataSource, установленному на BindingList<T>.

Только базовые списки, которые реализуют интерфейс IBindingListView Поддержка фильтрации.

Вы можете выбирать BindingList<T> с помощью Linq:

var filteredBindingList= new BindingList<T>(bindingList.Where(x=>some criteria).ToList()); 

Затем вы можете использовать фильтрованную связывания список в качестве источника данных.

+2

@Franklin. Единственный способ для 'BindingSource.Filter' - фактически использовать ваш источник, если базовая коллекция источников реализует' IBindingListView', как обсуждалось [здесь] (http://stackoverflow.com/a/10074142/3773066). В противном случае это решение - ваш ответ. – OhBeWise

+0

Спасибо, я работаю над этим. –

0

Вы можете попробовать:

bd.resetBindings(false) 

Успехов

UPDATE

Я хотел бы попробовать что-то вроде этого:

bd.Filter = string.Format("TAG_FAZENDA like '%{0}%'", cbTagFaz.Text); 
    gvFiltro.resetbindings(false) 
    gvFiltro.Update(); 

    bindNav.resetbindings(false) 
    bindNav.Update(); 

Только это.

+0

Я не нашел это в списке методов для частного System.Windows.Forms.DataGridView gvFiltro; –

+0

Да, извините, у меня есть собственный DatagridView. См. Обновленную информацию выше. –

+0

Я тоже пробовал это, но не работает. Правильно ли это выражение фильтра? Имя столбца TAG_FAZENDA, я считаю, что это правильно. DataGridView возвращает все строки, а не отфильтрованные строки. –

Смежные вопросы