首页 > 解决方案 > 在 C# WPF 中使用数据表过滤数据网格的正确方法

问题描述

我正在创建一个 WPF 应用程序。有一个DataGrid显示我的项目和搜索栏来过滤数据。如您所知,我们不能将 a 中的特定行从Dataable另一个数据表中引用。所以我现在过滤的方式是克隆我的原始数据库并将与搜索栏文本匹配的行添加到克隆的数据表中。之后将数据网格设置ItemsSource为克隆的数据表以显示过滤的行。

现在的问题是,当我用过滤的行编辑我的数据网格时,显然克隆的数据表正在被修改,而不是原始数据表。那么我怎样才能在原始数据表中进行这些更改呢?

我尝试从原始数据表中引用行,但这不可能,因为DataRow内存中的一个容器只能有一个容器,在这种情况下是原始数据表。

编辑

答案很简单,而不是使用专为此目的设计的2 DataTableuse a 。DataView请参阅下面的修改后的代码。

我的过滤逻辑:

var filteredTable = dt.Clone();

foreach( DataRow row in dt.Rows)
{
    if(row[FilterCategory].ToString().StartsWith(txtb_search.Text))
    {
         filteredTable.Rows.Add(row.ItemArray);
    }
}

ItemsGrid.ItemsSource = filteredTable.DefaultView;

标签: c#datagriddatatables

解决方案


以下是如何使用 DataView 进行过滤的正确方法。根据filter要求,字符串可以有多种形式。sortColumnfilterColumn现在,但可以是任何基于排序的列。这是所有这一切的快速教程:http ://www.csharp-examples.net/dataview-rowfilter/

 string filterColumn = dt.Columns[columnIndex].ToString();
 string filter = filterColumn + " LIKE '" + txtb_search.Text + "*'";

 DataView dv = new DataView(dt, filter, sortColumn , DataViewRowState.CurrentRows);
 ItemsGrid.ItemsSource = dv;

推荐阅读