2010-11-12 95 views
24

我搜索一個示例或示例來篩選WPF DataGrid列元素文本框。WPF DataGrid篩選器

alt text

類似的東西來this(給出的示例使用WPFToolkit ...由微軟顯然放棄了...)

編輯

代碼更新

XAML

<Canvas> 
    <DataGrid Height="200" Name="dataGrid1" Width="200" Canvas.Top="23" /> 
    <TextBox Name="textBox1" Width="120" /> 
</Canvas> 

CS:

public partial class MainWindow : Window 
{ 
    private List<Personne> persons; 
    ICollectionView cvPersonnes; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     persons = new List<Personne>(); 

     persons.Add(new Personne() { Id = 1, Nom = "Jean-Michel", Prenom = "BADANHAR" }); 
     persons.Add(new Personne() { Id = 1, Nom = "Gerard", Prenom = "DEPARDIEU" }); 
     persons.Add(new Personne() { Id = 1, Nom = "Garfild", Prenom = "THECAT" }); 
     persons.Add(new Personne() { Id = 1, Nom = "Jean-Paul", Prenom = "BELMONDO" }); 

     cvPersonnes = CollectionViewSource.GetDefaultView(persons); 

     if (cvPersonnes != null) 
     { 
      dataGrid1.AutoGenerateColumns = true; 
      dataGrid1.ItemsSource = cvPersonnes; 
      cvPersonnes.Filter = TextFilter; 
     } 
    } 

    public bool TextFilter(object o) 
    { 
     Personne p = (o as Personne); 
     if (p == null) 
      return false; 

     if (p.Nom.Contains(textBox1.Text)) 
      return true; 
     else 
      return false; 
    } 

} 

public class Personne 
{ 
    public int Id { get; set; } 
    public string Nom { get; set; } 
    public string Prenom { get; set; } 
} 

回答

23

可以通過它結合到支持濾波的ICollectionView過濾在數據網格中的項目。

詳細信息here對於.NET 4.該過程對於.NET 4.5是相同的,但似乎文檔已丟失。在「分組,排序和篩選」標題下有一小段提及here

編輯:在最初編寫時,WPF工具包並未被微軟放棄。過去是其中的一部分的控件現在在框架中,並且工具包還活着並且表現良好here

+0

你能評論我的代碼編輯嗎?過濾OnTextboxTextChange如何工作? – serhio 2010-11-16 20:43:08

+2

@vlad看起來你很快就說它不會被放棄。 – MgSam 2013-03-13 14:09:04

+0

被遺棄可能是錯誤的術語 - 該工具包已集成到.NET 4.0+中。'Relocated'可能是一個更好的詞... – Doug 2014-03-12 17:58:59

0

我寫了自己的FilterDataGrid控件,它比在CodeProject或其他地方提供的控件靈活得多。我既不能在這裏發佈完整的代碼,也不能發佈它。

但是:由於您的數據源是最有可能裹成ICollectionView,你可以做這樣的事情:

public void ApplyFilters() 
    { 
     ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource); 
     if (view != null) 
     { 
      view.Filter = FilterPredicate; 
     } 
    } 

    private bool FilterPredicate(object item) 
    { 
     var yourBoundItemOrRow = item as BoundItemType; 

     return aFilterObject.Matches(yourBoundItemOrRow); 
    } 

您可以輕鬆實現基於這種理念的任何過濾邏輯。即使非常非常強大的過濾器。注意:我有我自己的類中的方法派生自datagrid。他們可以適應在網格外工作,例如,在UserControl中也是如此,例如在UserControl中

+0

你能看到我的代碼更新嗎?當用戶在文本框中輸入時如何過濾? – serhio 2010-11-16 20:39:11

6

我在這件事情的各種網站無事生非嗎...

要過濾後者使用數據表作爲源,這是很常見的使下面的代碼數據網格:

DataTable dt = new DataTable("Table1"); 

//fill your datatable... 

//after fill... 
dataGrid1.DataContext = dt; 
IBindingListView blv = dt.DefaultView; 
blv.Filter = "NAME = 'MOISES'";