【问题标题】:c# How to build a custom DataView from a DataTable?c# 如何从 DataTable 构建自定义 DataView?
【发布时间】:2018-07-16 22:36:51
【问题描述】:

我需要从 DataTable 创建一个 DataView,但有一个不寻常的转折:

我需要逐行决定(使用代码)DataTable 中的哪些行包含在 DataView 中。

DataTable dt = LoadData();
DataView dv = new DataView(dt);

foreach (DataRow row in dt.Rows)
{
    if (RowIsGood(row))
    { 
        // This obviously doesn't work but I need equivalent logic:
        DataRowView drv = new DataRowView();
        drv.Row = row;
        dv.Add(drv);
    }
}

需要注意的一些重要事项:

  1. 上述 RowIsGood 函数中的代码过于复杂,无法使用标准 RowFilter 方法进行复制。
  2. DataTable 可能非常大。它也被多个网格控件引用。无法向 DataTable 添加临时列以方便 RowFilter 操作。
  3. 我使用的是 .NET v4.0。

那么甚至可以使用 DataTable/DataView 架构吗?

LINQ 是否允许我根据需要自定义 DataView?

提前致谢!

【问题讨论】:

  • 要求有点模糊,但我会避免这种方法。您可以在 DT 中添加一列或多列,以总结过于复杂的各种条件。目标是获得某种级别的原始值,您可以在 RowFilter 中使用这些值。
  • 我认为创建一个带有“RowIsGood”结果的简化表应该可行吗?像“DataTable reduceDt = dt.Clone(); 然后在 for 循环中,if (RowIsGood){ reduceDt.ImportRow(row);} 然后在循环之后,“DataView dv = new DataView(reducedTable);”或者我错过了什么吗?
  • 您是否考虑过DataView.Delete 而没有调用AcceptChanges?这些行只是简单地进入删除状态并被隐藏(直到你想要它们回来,然后你可以拒绝更改)

标签: c# datatable ado.net dataview


【解决方案1】:
DataView dv = (from n in DT.AsEnumerable() Where RowIsGood(n) select n ).AsDataView();

【讨论】:

    【解决方案2】:

    由于您正在寻找逐行解决方案,并且已经有一个接受 DataRow 并返回 bool 的函数。

    只需将引用添加到System.Data.DataSetExtensions 并使用AsDataView 方法

    DataView dv=DT.AsEnumerable().Where(RowIsGood).AsDataView();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2011-05-04
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多