20

これを使用して、データグリッドにオブジェクトのリストをロードします。

dataGrid1.Items.Add(model);

modelデータベースからのデータになります。Id(int)Name(string)および_Text(string)

私のデータグリッドでは、の名前のみを表示しmodelます。テキストボックスに何かを入力したときに、データグリッドをフィルタリングするにはどうすればよいですか?

私はこのページにいました: http://msdn.microsoft.com/en-us/library/vstudio/ff407126(v=vs.100).aspxしかし、そこからのコードを理解できず、方法を説明できません私の問題のためにそれを転置する必要があります。

4

6 に答える 6

49

コレクションをフィルタリングする方法は複数あります

これがあなたのアイテムクラスであることを提案しましょう

public class Model
{
    public string Name
    {
        get;
        set;
    }
}

あなたのコレクションは次のようになります

       var ObColl = new ObservableCollection<Model>();

        ObColl.Add(new Model() { Name = "John" });
        ObColl.Add(new Model() { Name = "Karl" });
        ObColl.Add(new Model() { Name = "Max" });
        ObColl.Add(new Model() { Name = "Mary" });

方法 1 (述語):

    public MainWindow()
    {
        InitializeComponent();

        // Collection which will take your ObservableCollection
        var _itemSourceList = new CollectionViewSource() { Source = ObColl };

        // ICollectionView the View/UI part 
        ICollectionView Itemlist = _itemSourceList.View;

        // your Filter
        var yourCostumFilter= new Predicate<object>(item => ((Model)item).Name.Contains("Max"));

        //now we add our Filter
        Itemlist.Filter = yourCostumFilter;

        dataGrid1.ItemsSource = Itemlist;
    }

方法 2 (FilterEventHandler):

    public MainWindow()
    {
        InitializeComponent();

        // Collection which will take your Filter
        var _itemSourceList = new CollectionViewSource() { Source = ObColl };

       //now we add our Filter
       _itemSourceList.Filter += new FilterEventHandler(yourFilter);

        // ICollectionView the View/UI part 
        ICollectionView Itemlist = _itemSourceList.View;

        dataGrid1.ItemsSource = Itemlist;
    }

    private void yourFilter(object sender, FilterEventArgs e)
    {
        var obj = e.Item as Model;
        if (obj != null)
        {
            if (obj.Name.Contains("Max"))
                e.Accepted = true;
            else
                e.Accepted = false;
        }
    }

Way 1への拡張情報

複数の条件または複雑なフィルターが必要な場合は、Predicat にメソッドを追加できます

    // your Filter
    var yourComplexFilter= new Predicate<object>(ComplexFilter);

    private bool ComplexFilter(object obj)
    {
        //your logic
    }
于 2013-03-22T13:30:56.360 に答える
9

これは、ICollectionView の Filter プロパティを使用した単純な実装です。XAML に次のものが含まれているとします。

<TextBox x:Name="SearchTextBox" />
<Button x:Name="SearchButton"
        Content="Search"
        Click="SearchButton_OnClick"
        Grid.Row="1" />
<DataGrid x:Name="MyDataGrid"
          Grid.Row="2">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Lorem ipsum column"
                            Binding="{Binding}" />
    </DataGrid.Columns>
</DataGrid>

次に、コンストラクターで、コレクションのすべてのアイテムに対して実行されるフィルター述語を設定できるデータのデフォルト ビューを取得できます。CollectionView はいつコレクションを更新する必要があるかを認識しないため、ユーザーが検索ボタンをクリックしたときに Refresh を呼び出す必要があります。

private ICollectionView defaultView;

public MainWindow()
{
    InitializeComponent();

    string[] items = new string[]
    {
        "Asdf",
        "qwer",
        "sdfg",
        "wert",
    };

    this.defaultView = CollectionViewSource.GetDefaultView(items);
    this.defaultView.Filter =
        w => ((string)w).Contains(SearchTextBox.Text);

    MyDataGrid.ItemsSource = this.defaultView;
}

private void SearchButton_OnClick(object sender, RoutedEventArgs e)
{
    this.defaultView.Refresh();
}

次の URL で、CollectionViews のより詳細な説明を見つけることができます: http://wpftutorial.net/DataViews.html

于 2013-03-22T12:31:11.693 に答える
0

DataBindingを見てください->あなたの場合、グリッドにアイテムを追加しないでください、しかしitemssourceを設定してください

<Datagrid ItemsSource="{Binding MyCollectionOfModels}" />

また

dataGrid1.ItemsSource = this._myCollectionOfModels;

ある種のフィルタリング、並べ替え、グループ化が必要な場合は、CollectionViewをご覧ください

于 2013-03-22T11:34:49.677 に答える
0

データグリッドの行をフィルタリングするには、dataview フィルターを使用できます。

            DataView dv = datatable.DefaultView;

            StringBuilder sb = new StringBuilder();
            foreach (DataColumn column in dv.Table.Columns)
            {
                sb.AppendFormat("[{0}] Like '%{1}%' OR ", column.ColumnName, "FilterString");
            }
            sb.Remove(sb.Length - 3, 3);
            dv.RowFilter = sb.ToString();
            dgvReports.ItemsSource = dv;
            dgvReports.Items.Refresh();

「データテーブル」はデータグリッドに指定されたデータソースであり、文字列ビルダーを使用してフィルタークエリを作成します。ここで、「フィルター文字列」はデータグリッドで検索するテキストであり、それをデータビューに設定し、最後にデータビューをアイテムソースとしてデータグリッドに設定しますそしてリフレッシュ。

于 2016-08-11T07:20:22.883 に答える
0

私は愚かな方法を見つけ、これが古い質問であることを知っていますが... DataGrid オブジェクトの項目プロパティでフィルター関数を使用するだけです。このように:(申し訳ありませんが、私はVBしか学びませんでした)

Public Property SearchName As String
    Get
        Return _SearchName
    End Get
    Set
        _SearchName = Value
        DG_drw_overview.Items.Filter = New Predicate(Of Object)(Function(x) x.Name.Contains(Value))           
    End Set
End Property

このプロパティは、テキスト ボックスに何かを入力するたびに変更されます。DG_drw_overview は DataGrid インスタンスです。Predicate では、オブジェクトは DataGrid に配置したオブジェクトを表します。

次に、SearchName をテキストボックスにバインドします

<TextBox x:Name="TB_search" 
         Text="{Binding SearchName, UpdateSourceTrigger=PropertyChanged}"/>

テキストボックスのデータコンテキストをメインクラスに設定します (通常は InitializeComponent() の後)

TB_search.DataContext = Me
于 2021-06-25T11:22:01.597 に答える