2010-11-12 8 views
24

Je recherche un exemple ou un échantillon pour filtrer les éléments de colonne WPF DataGrid dans une zone de texte.Filtre WPF DataGrid

alt text

Quelque chose de semblable à this (l'exemple utilise un WPFToolkit ... apparemment abandonné par Microsoft ...)

EDIT

Code de mise à jour

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; } 
} 

Répondre

23

Vous pouvez filtrer les éléments dans le DataGrid en se liant à un ICollectionView qui prend en charge le filtrage.

Détails here pour .NET 4. Le processus est le même pour .NET 4.5, mais il semble que la documentation a été perdue. Il y a une petite mention à here sous la rubrique "Grouper, trier et filtrer".

edit: au moment où il a été écrit à l'origine, la boîte à outils WPF n'avait pas été abandonnée par Microsoft. Les contrôles qui en faisaient partie sont maintenant dans le framework, et le toolkit était bien vivant here

+0

pourriez-vous commenter mon code modifier? Comment fonctionne le filtrage OnTextboxTextChange? – serhio

+2

@vlad On dirait que vous avez parlé trop tôt de ne pas être abandonné. – MgSam

+0

Abandonné est probablement le mauvais terme - la boîte à outils a été intégrée dans .NET 4.0+.'Relocated' pourrait être un meilleur mot ... – Doug

0

J'ai écrit mon propre FilterDataGrid Control, il est beaucoup plus flexible que ceux fournis sur CodeProject ou ailleurs. Je ne peux ni publier le code complet ici, ni le publier.

Mais: Étant donné que votre source de données est très probablement enveloppé dans un ICollectionView, vous pouvez faire quelque chose comme ceci:

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); 
    } 

Vous pouvez mettre en œuvre une logique de filtrage facilement basé sur ce concept. Même des filtres très, très puissants. Note: J'ai ces méthodes dans ma propre classe dérivée de DataGrid. Ils peuvent également être adaptés pour fonctionner en dehors de la grille, par exemple dans un UserControl

+0

pourriez-vous voir ma mise à jour de code. Comment filtrez-vous lorsque l'utilisateur tape dans la zone de texte? – serhio

6

Je l'ai vu à divers endroits beaucoup de bruit à ce sujet ...

pour filtrer ce dernier étant un DataGrid à l'aide d'une table de données comme source, ce qui est assez commun pour rendre le code ci-dessous:

DataTable dt = new DataTable("Table1"); 

//fill your datatable... 

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