6

如何将数据从数据集过滤到数据表?喜欢代码->

DataRow[] dr = DS.Tables[0]
    .Select("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");        

我如何在这里使用数据表?

以下代码不反映更改->

DataTable FilteredDataD = DS.Tables[0];
if (FilteredDataD.Rows.Count > 0) {
    FilteredDataD.DefaultView.RowFilter = "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL";
    FilteredDataD.DefaultView.ToTable();
}

是否可以使用上述过滤器删除列,例如“STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL”+ FilteredDataD.column("col_name")...假设我有 5 列仅显示 4,我无法删除col_name 来自我的查询。有办法吗?

回复

4

2 回答 2

11

尝试改用 LINQ:

var table = DS.Tables[0].AsEnumerable().Where(
    r => r.Field<string>("STAGENAME") == "Develop" && r.Field<int?>("DEVLAPSEDAYS").HasValue).AsDataView().ToTable();

编辑更改AsDataViewAsDataView()语法准确性。
编辑提供 .NET 2.0 兼容的解决方案

DataTable table = DS.Tables[0];
if (table.Rows.Count > 0)
{
    table.DefaultView.RowFilter = "STAGENAME = 'DEVELOP' AND DEVLAPSEDAYS IS NOT NULL";
    table = table.DefaultView.ToTable(); 
}
于 2012-04-25T14:10:34.483 回答
6

您可以编写一个扩展方法(使用 C# 3),如下所示:

public static DataTable Filter(this DataTable dataTable, string selectFilter)
{
    var filteredTable = dataTable.Clone();
    var rows = dataTable.Select(selectFilter).ToList();
    rows.ForEach(filteredTable.ImportRow);
    return filteredTable;
}

然后像下面这样使用它:

DataTable dataTable = DS.Tables[0]
    .Filter("STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");

更新,因为您说您使用的是 C# 2.0(因此扩展方法和 LINQ 不是一个选项),您可以使用它来代替:

public static DataTable GetFilteredTable(
    DataTable sourceTable, string selectFilter)
{
    var filteredTable = sourceTable.Clone();
    var rows = sourceTable.Select(selectFilter);
    foreach (DataRow row in rows)
    {
        filteredTable.ImportRow(row);
    }
    return filteredTable;
}

DataTable dataTable = GetFilteredTable(
    DS.Tables[0], "STAGENAME='Develop' AND DEVLAPSEDAYS IS NOT NULL");
于 2012-04-25T14:10:10.083 回答