Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#如何从数据表构建自定义数据视图?_C#_Datatable_Ado.net_Dataview - Fatal编程技术网

c#如何从数据表构建自定义数据视图?

c#如何从数据表构建自定义数据视图?,c#,datatable,ado.net,dataview,C#,Datatable,Ado.net,Dataview,我需要从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 nee

我需要从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);
    }
}
需要注意的一些重要事项:

  • 上面RowIsGood函数中的代码太复杂,无法使用标准的RowFilter方法进行复制
  • 数据表可能非常大。它还被多个栅格控件引用。不可能向DataTable中添加临时列以促进RowFilter操作
  • 我正在使用.NETV4.0
  • 那么,使用DataTable/DataView体系结构是否可能

    LINQ是否允许我自定义所需的数据视图


    提前谢谢

    因为您正在寻找逐行解决方案,并且已经有了一个接受数据行并返回bool的函数

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

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

    因为您正在寻找逐行解决方案,并且已经有了一个接受数据行并返回bool的函数

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

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

    这些要求有点模糊,但我会避免这种做法。您可以在DT中添加一个或多个列,这些列总结了太复杂的各种情况。我们的目标是获得一些可以在行过滤器中使用的原始值级别。我认为创建一个具有“RowIsGood”结果的简化表应该可以吗?类似于“DataTable reducedt=dt.Clone();然后在for循环中,if(RowIsGood){reducedt.ImportRow(row);}然后在循环之后,“DataView dv=new DataView(reducetable)”;“还是我遗漏了什么?您是否考虑过
    DataView.Delete
    而不是call AcceptChanges?这些行只会停留在已删除状态并被隐藏(直到您想要返回它们,然后您可以拒绝更改)要求有点模糊,但我会避免这种方法。您可以在DT中添加一个或多个列,以总结过于复杂的各种情况。目标是获得一些可以在行筛选器中使用的原始值级别。我会考虑创建一个带有“RowIsGood”的简化表“结果应该有效吗?类似于“DataTable reducedt=dt.Clone();然后在for循环中,if(RowIsGood){reducedt.ImportRow(row);}然后在循环之后,“DataView dv=new DataView(reducetable)”;“还是我遗漏了什么?您是否考虑过
    DataView.Delete
    而不是call AcceptChanges?这些行只会停留在已删除状态并被隐藏(直到您想要返回它们,然后您可以拒绝更改)