Фильтрация DataGrid в текстовом поле - PullRequest
25 голосов
/ 12 ноября 2010

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

alt text

Что-то похожее на this (в данном примере используетсяa WPFToolkit ... явно заброшенный Microsoft ...)

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

Ответы [ 4 ]

25 голосов
/ 12 ноября 2010

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

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

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

6 голосов
/ 15 февраля 2012

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

Чтобы отфильтровать последний, являющийся сеткой данных, используя источник данных в качестве источника, что довольно часто делается для кода ниже:

DataTable dt = new DataTable("Table1");

//fill your datatable...

//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";
3 голосов
/ 08 января 2012

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

0 голосов
/ 12 ноября 2010

Я написал свой собственный элемент управления FilterDataGrid, он гораздо более гибкий, чем те, что представлены в CodeProject или где-либо еще.Я не могу ни опубликовать полный код здесь, ни опубликовать его.

Но: поскольку ваш источник данных, скорее всего, заключен в ICollectionView, вы можете сделать что-то вроде этого:Вы можете легко реализовать любую логику фильтра на основе этой концепции.Даже очень, очень мощные фильтры.Примечание: у меня есть эти методы в моем собственном классе, полученные из сетки данных.Они также могут быть адаптированы для работы вне сетки, например, в UserControl

...