2010-11-12 28 views
24

Busco un ejemplo o muestra para filtrar los elementos de la columna WPF DataGrid y un cuadro de texto.Filtro WPF DataGrid

alt text

Algo similar a this (el ejemplo utiliza una WPFToolkit ... parece ser abandonado por Microsoft ...)

EDITAR

código de actualización de

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

Respuesta

23

Puede filtrar los elementos en la cuadrícula de datos mediante la unión a un ICollectionView que admite el filtrado.

Detalles here para .NET 4. El proceso es el mismo para .NET 4.5, pero parece que la documentación se ha perdido. Hay una pequeña mención al here en el encabezado "Agrupación, clasificación y filtrado".

editar: en el momento en que se escribió originalmente, el kit de herramientas de WPF no había sido abandonado por Microsoft. Los controles que solían formar parte de él están ahora en el marco, y el kit de herramientas estaba activo y funcionando bien. here

+0

¿Podría comentar mi código de edición? ¿Cómo funciona el filtrado OnTextboxTextChange? – serhio

+2

@vlad Parece que habló demasiado pronto para que no se abandone. – MgSam

+0

Abandoned es probablemente el término equivocado: el kit de herramientas se integró a .NET 4.0+.'Relocated' podría ser una palabra mejor ... – Doug

0

He escrito mi propio control FilterDataGrid, es mucho más flexible que los provistos en CodeProject o en otro lugar. No puedo publicar el código completo aquí, ni puedo publicarlo.

Pero: Debido a que su fuente de datos es más probable envuelto en una ICollectionView, se puede hacer algo como esto:

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

Se puede implementar cualquier lógica del filtro fácilmente sobre la base de este concepto. Incluso filtros muy, muy potentes. Nota: Tengo esos métodos en mi propia clase derivados de datagrid. También se pueden adaptar para trabajar fuera de la red, por ejemplo en un UserControl

+0

podría ver mi actualización de código. ¿Cómo se filtra cuando el usuario está escribiendo en el cuadro de texto? – serhio

6

que he visto en varios lugares de mucho ruido y pocas este asunto ...

para filtrar siendo esta última una cuadrícula de datos usando una tabla de datos como la fuente, que es bastante común para hacer que el código de abajo:

DataTable dt = new DataTable("Table1"); 

//fill your datatable... 

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