在文本框中筛选DataGrid

时间:2010-11-12 15:52:40

标签: wpf datagrid wpfdatagrid

我搜索示例或示例以通过文本框过滤WPF DataGrid列元素。

alt text

this类似的东西(给定的示例使用 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 个答案:

答案 0 :(得分:25)

您可以通过将DataGrid绑定到支持过滤的ICollectionView来过滤DataGrid中的Items。

.NET 4的详细信息here。对于.NET 4.5,该过程是相同的,但似乎文档已丢失。在“分组,排序和过滤”标题下有一点提及here

编辑:在最初编写时,微软没有放弃WPF工具包。以前作为其一部分的控件现在在框架中,工具包还活着并且运行良好here

答案 1 :(得分:6)

我在各个网站上看到过很多关于这件事的事情......

使用数据表作为源过滤后者是一个数据网格,这在下面的代码中非常常见:

DataTable dt = new DataTable("Table1");

//fill your datatable...

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

答案 2 :(得分:3)

有几种解决方案,但在我看来,最好的解决方案是仅使用DataGrid样式而没有发明新的继承DataGird类型的解决方案。以下是我发现的最好的:

答案 3 :(得分: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