从数据条件创建DataColumnCollection

时间:2016-02-25 15:50:07

标签: c# datatable

我有这个DataTable

+----+---+---+---+
| id | s | m | l |
+----+---+---+---+
| 1  | 2 | 3 |   |
+----+---+---+---+
| 2  |   | 3 | 4 |
+----+---+---+---+

s, m, l代表T恤尺码,价值是数量。我必须显示单行(假设id = 1)只显示具有值的大小列。所以,对于我的行,我只会显示列s和m。有没有办法只将数据表从我需要的列中删除?

1 个答案:

答案 0 :(得分:1)

DataTable通常包含多个DataRows,但只包含一个DataColumnCollection。因此,您可以删除所有列中没有至少一行值的列。

然后你需要创建一个新的DataTable,只有"填充"列。以下方法不仅适用于单个DataRow,还适用于多个:

var rows = dataTable.AsEnumerable()
    .Where(row => row.Field<int>("ID") == id);    // a LINQ query

var columnsWithoutValues =  dataTable.Columns.Cast<DataColumn>()
    .Where(col => rows.All(r => r.IsNull(col)));  // columns without values

DataTable tblResult = dataTable.Clone(); // same columns no data
foreach (DataColumn colToRemove in columnsWithoutValues)
    tblResult.Columns.Remove(colToRemove.ColumnName); // remove columns without data

tblResult.BeginLoadData();   // disable constraints temporarily
foreach (DataRow row in rows)
{
    DataRow newRow = tblResult.Rows.Add();
    foreach (DataColumn col in tblResult.Columns)
        newRow[col] = row[col.ColumnName];
}
tblResult.EndLoadData();