サンプルまたはサンプルを検索して、テキストボックスでWPF DataGrid列要素をフィルター処理します。
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; }
}
私はさまざまなサイトでこの問題について大騒ぎしています...
データテーブルをソースとして使用するデータグリッドである後者をフィルタリングするには、以下のコードを作成するのが一般的です:
DataTable dt = new DataTable("Table1");
//fill your datatable...
//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";
いくつかの解決策がありますが、私の意見では、最良の解決策は、新しい継承されたDataGrid
型を作成せずにDataGird
スタイルのみを使用するものです。以下は私が見つけた最高のものです:
独自の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で動作するように適合させることができます。