【问题标题】:Correct way of filtering datagrid using datatables in C# WPF在 C# WPF 中使用数据表过滤数据网格的正确方法
【发布时间】:2018-09-25 18:58:10
【问题描述】:

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

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

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

编辑

答案很简单,而不是使用 2 DataTable 使用专门为此目的设计的 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;

【问题讨论】:

  • 你为什么不使用 DataView?
  • @NewContributor 我多么天真我不知道这一点。这正是我想要的。我将很快发布带有修改代码的答案。

标签: c# datagrid datatables


【解决方案1】:

这里是如何使用 DataView 进行过滤的正确方法。 filter 字符串可以有多种形式,具体取决于要求。 sortColumn 现在是 filterColumn,但可以是任何作为排序基础的列。这是所有这些的快速教程: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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多