web-dev-qa-db-fra.com

Filtrer un DataGrid sur une zone de texte

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

alt text

Quelque chose de similaire à this (l'exemple donné utilise un WPFToolkit ... apparemment abandonné par 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; }
}
25
serhio

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

Détails ici pour .NET 4. Le processus est le même pour .NET 4.5, mais il semble que la documentation ait été perdue. Il y a une petite mention ici sous la rubrique "Groupement, tri et filtrage".

edit: au moment où cela 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 cadre, et la boîte à outils était bien vivante et fonctionnait bien ici

25
vlad

J'ai vu sur divers sites beaucoup de bruit à ce sujet ...

Pour filtrer ce dernier étant une grille de données utilisant une table de données comme source, ce qui est assez courant 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'";
6
Moises Marques

Il existe plusieurs solutions, mais à mon avis, les meilleures solutions sont celles qui utilisent uniquement les styles DataGrid sans inventer un nouveau type hérité DataGird. Les suivants sont les meilleurs que j'ai trouvés:

3
Mohammed A. Fadil

J'ai écrit mon propre contrôle FilterDataGrid, 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ée dans une 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 facilement implémenter n'importe quelle logique de filtre basée sur ce concept. Même des filtres très, très puissants. Remarque: J'ai ces méthodes dans ma propre classe dérivée de datagrid. Ils peuvent également être adaptés pour fonctionner en dehors du réseau, par exemple dans un UserControl

0
Falcon