Je recherche un exemple ou un échantillon pour filtrer les éléments de colonne WPF DataGrid par une zone de texte.
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; }
}
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
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'";
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:
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