web-dev-qa-db-ja.com

テキストボックスでDataGridをフィルター処理する

サンプルまたはサンプルを検索して、テキストボックスで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; }
}
25
serhio

フィルタリングをサポートするICollectionViewにバインドすることにより、DataGridのアイテムをフィルタリングできます。

.NET 4の詳細 here 。プロセスは.NET 4.5でも同じですが、ドキュメントが失われたようです。 「Grouping、Sorting、and Filtering」の見出しの下に、小さな言及があります here

編集:これが最初に書かれた時点では、WPFツールキットはMicrosoftによって放棄されていませんでした。以前はその一部であったコントロールはフレームワーク内にあり、ツールキットは生きていてうまく機能していました here

25
vlad

私はさまざまなサイトでこの問題について大騒ぎしています...

データテーブルをソースとして使用するデータグリッドである後者をフィルタリングするには、以下のコードを作成するのが一般的です:

DataTable dt = new DataTable("Table1");

//fill your datatable...

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

いくつかの解決策がありますが、私の意見では、最良の解決策は、新しい継承されたDataGrid型を作成せずにDataGirdスタイルのみを使用するものです。以下は私が見つけた最高のものです:

3

独自の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
Falcon