2010-11-12 4 views
24

Я ищу пример или образец для фильтрации элементов столбца WPF DataGrid в текстовом поле.Фильтр WPF DataGrid

alt text

Нечто подобное this (в данном примере используется WPFToolkit ... видимо, оставленную Microsoft ...)

EDIT

код Обновить

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

Вы можете фильтровать элементы в DataGrid, связывая его с ICollectionView, который поддерживает фильтрацию.

here для .NET 4. Процесс такой же для .NET 4.5, но, похоже, документация была потеряна. Есть небольшое упоминание об этом here в разделе «Группирование, сортировка и фильтрация».

Редактировать: в то время, когда это было изначально написано, инструментарий WPF не был оставлен Microsoft. Элементы управления, которые когда-то были частью этого, теперь находятся в рамках, и набор инструментов был жив и преуспел. here

+0

Можете ли вы прокомментировать мой код? Как работает фильтрация OnTextboxTextChange? – serhio

+2

@vlad Похоже, вы слишком скоро говорили о том, что это не заброшено. – MgSam

+0

Заброшенный, вероятно, неправильный термин - инструментарий был интегрирован в .NET 4.0+.«Перемещенный» может быть лучшим словом ... – Doug

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

+0

Можете ли вы увидеть обновление моего кода. Как вы фильтруете, когда пользователь вводит текстовое поле? – serhio

3

Существует несколько решений, но, на мой взгляд, лучшие решения - это те, которые используют только стили DataGrid, не изобретая новый унаследованный тип DataGird , Ниже перечислены лучшее, что я нашел:

6

я видел на различных сайтах много шума этому вопросу ...

для фильтрации последний является DataGrid с помощью DataTable в качестве источника, который является довольно распространенным явлением, чтобы сделать код ниже:

DataTable dt = new DataTable("Table1"); 

//fill your datatable... 

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