2010-11-12 4 views
24

Ricerca un esempio o un esempio per filtrare gli elementi della colonna DataGrid di WPF come una casella di testo.WPF DataGrid filter

alt text

Qualcosa di simile a this (l'esempio dato utilizza un WPFToolkit ... a quanto pare abbandonato da Microsoft ...)

EDIT

Codice Aggiornamento

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

risposta

23

È possibile filtrare le voci del DataGrid legandosi a un ICollectionView che supporta il filtraggio.

Dettagli here per .NET 4. Il processo è lo stesso per .NET 4.5, ma sembra che la documentazione sia stata persa. C'è una piccola menzione here sotto l'intestazione "Raggruppamento, ordinamento e filtro".

modifica: al momento in cui questo è stato originariamente scritto, il toolkit WPF non era stato abbandonato da Microsoft. I controlli che ne facevano parte adesso sono nel framework e il toolkit era vivo e funzionante here

+0

potresti commentare il mio codice di modifica? Come funziona il filtro OnTextboxTextChange? – serhio

+2

@vlad Sembra che tu abbia parlato troppo presto per non essere abbandonato. – MgSam

+0

Abbandonato è probabilmente il termine sbagliato: il toolkit è stato integrato in .NET 4.0+.'Trasferito' potrebbe essere una parola migliore ... – Doug

0

Ho scritto il mio controllo FilterDataGrid, è molto più flessibile di quelli forniti su CodeProject o altrove. Non posso né pubblicare il codice completo qui, né posso pubblicarlo.

Ma: Dal momento che il datasource è molto probabilmente avvolto in un ICollectionView, si può fare qualcosa di simile:

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

è possibile implementare qualsiasi logica di filtro facilmente sulla base di questo concetto. Anche filtri molto, molto potenti. Nota: ho quei metodi nella mia classe derivati ​​da datagrid. Possono essere adattati per funzionare anche al di fuori della rete, ad esempio in un UserControl

+0

potresti vedere il mio aggiornamento del codice. Come si filtra quando l'utente sta digitando nella casella di testo? – serhio

6

ho visto in vari siti molto rumore su questo argomento ...

per filtrare quest'ultimo è un datagrid utilizzando un datatable come sorgente, che è abbastanza comune per rendere il codice qui sotto:

DataTable dt = new DataTable("Table1"); 

//fill your datatable... 

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