在WPF中过滤DataGrid

我用这个加载数据网格中的对象列表:

dataGrid1.Items.Add(model); 

model成为数据库中的数据。 它有Id(int)Name(string)Text(string)

在我的数据网格中,我只显示model的名称。 当我在文本框中输入内容时,如何现在过滤数据网格?

我在这个页面: http : //msdn.microsoft.com/en-us/library/vstudio/ff407126(v=vs.100).aspx但我不明白那里的代码我无法解释如何我应该为我的问题转移那个。

过滤集合有多种方法

让我们建议这是你的物品类

 public class Model { public string Name { get; set; } } 

而你的collections看起来像

  var ObColl = new ObservableCollection(); ObColl.Add(new Model() { Name = "John" }); ObColl.Add(new Model() { Name = "Karl" }); ObColl.Add(new Model() { Name = "Max" }); ObColl.Add(new Model() { Name = "Mary" }); 

方式1(谓词):

  public MainWindow() { InitializeComponent(); // Collection which will take your ObservableCollection var _itemSourceList = new CollectionViewSource() { Source = ObColl }; // ICollectionView the View/UI part ICollectionView Itemlist = _itemSourceList.View; // your Filter var yourCostumFilter= new Predicate(item => ((Model)item).Name.Contains("Max")); //now we add our Filter Itemlist.Filter = yourCostumFilter; dataGrid1.ItemsSource = Itemlist; } 

方式2(FilterEventHandler):

  public MainWindow() { InitializeComponent(); // Collection which will take your Filter var _itemSourceList = new CollectionViewSource() { Source = ObColl }; //now we add our Filter _itemSourceList.Filter += new FilterEventHandler(yourFilter); // ICollectionView the View/UI part ICollectionView Itemlist = _itemSourceList.View; dataGrid1.ItemsSource = Itemlist; } private void yourFilter(object sender, FilterEventArgs e) { var obj = e.Item as Model; if (obj != null) { if (obj.Name.Contains("Max")) e.Accepted = true; else e.Accepted = false; } } 

将信息扩展到方式1

如果需要多个条件或某些复杂的filter,您可以向Predicat添加方法

  // your Filter var yourComplexFilter= new Predicate(ComplexFilter); private bool ComplexFilter(object obj) { //your logic } 

这是使用ICollectionView的Filter属性的简单实现。 假设您的XAML包含以下内容:

        

然后在构造函数中,您可以获取数据的默认视图,您可以在其中设置将为集合的每个项目执行的过滤谓词。 CollectionView不知道何时应该更新集合,因此您必须在用户单击搜索按钮时调用Refresh。

 private ICollectionView defaultView; public MainWindow() { InitializeComponent(); string[] items = new string[] { "Asdf", "qwer", "sdfg", "wert", }; this.defaultView = CollectionViewSource.GetDefaultView(items); this.defaultView.Filter = w => ((string)w).Contains(SearchTextBox.Text); MyDataGrid.ItemsSource = this.defaultView; } private void SearchButton_OnClick(object sender, RoutedEventArgs e) { this.defaultView.Refresh(); } 

在此URL,您可以找到有关CollectionViews的更详细说明: http : //wpftutorial.net/DataViews.html

@WiiMaxx,不能评论为不够代表。 我会对那里的直接演员更加小心。 对于一件事和另一件事,它们可能很慢,如果将相同的filter应用于持有不同复杂类型数据的网格,则会出现InvalidCastException。

 // your Filter var yourCostumFilter= new Predicate(item => { item = item as Model; return item == null || item.Name.Contains("Max"); }); 

这不会破坏您的数据网格,并且如果转换失败则不会过滤结果。 如果代码错误,对用户的影响会减少。 最重要的是,由于“as”运算符没有像直接强制转换操作那样执行任何显式类型强制,因此filter将更快。

看看DataBinding – >在你的情况下不要将项添加到你的网格,但设置itemssource

  

要么

 dataGrid1.ItemsSource = this._myCollectionOfModels; 

如果你想要某种过滤,排序,分组看看CollectionView

您可以使用dataviewfilter来过滤数据网格行。

  DataView dv = datatable.DefaultView; StringBuilder sb = new StringBuilder(); foreach (DataColumn column in dv.Table.Columns) { sb.AppendFormat("[{0}] Like '%{1}%' OR ", column.ColumnName, "FilterString"); } sb.Remove(sb.Length - 3, 3); dv.RowFilter = sb.ToString(); dgvReports.ItemsSource = dv; dgvReports.Items.Refresh(); 

“datatable”是指向数据网格的数据源并使用字符串构建器构建filter查询,其中“过滤字符串”是您要在数据网格中搜索的文本,并将其设置为dataview,最后将dataview设置为dataource到datagrid并刷新它。