データの完全なコレクションを保存し、フィルターを実行する必要がある場合は、フィルター処理されたコレクションを作成し、フィルター処理されたコレクションをグリッドにバインドします。FilterGridDataを呼び出して、適切なテキスト変更イベントをフィルターボックスに接続するだけです。複数列を介してフィルタリングする場合にもうまく機能します。ああ、ここでBindingListを使用する必要はありません。グリッドにバインドするデータソースを使用します。これの核となるのは、「LINQでフィルタリングしてフィルタリングされたコレクションを作成する」ことです。
BindingList<Foo> _allFoos;
private void LoadData(IEnumerable<Foo> dataToDisplayInGrid)
{
this._allFoos = new BindingList<Foo>(dataToDisplayInGrid.ToList());
this.FilterGridData(string.Empty);
}
private void FilterGridData(string filterText)
{
BindingList<Foo> filteredList = null;
if (!string.IsNullOrEmpty(filterText))
{
string lowerCaseFilterText = filterText.ToLower();
IList<Foo> filteredItems = this._allFoos.Where(x => (x.Name ?? string.Empty).ToLower().Contains(lowerCaseFilterText)).ToList();
filteredList = new BindingList<Foo>(filteredItems);
}
else
{
filteredList = new BindingList<Foo>(this._allFoos);
}
dataGrid.DataSource = filteredList;
}