如何从现有DataTable创建子DataTable

时间:2014-01-20 23:27:51

标签: c# datatable

我有DataTable(dataTable1),有25-30列。我想通过创建一个小的DataTable(dataTable2)绑定一个DataGridView,该DataTable将具有来自现有DataTable的几列(可能是5-10)。

所以我的主要任务是创建一个DataTable,其中包含较少的列。

以下是我为此尝试过的代码..

DataTable subDataTable()
{
   DataTable smallTable=new DataTable();

   smallTable =dataTable1;// dataTable1 is already filled with data
   smallTable.Columns.Remove("Column2");
   smallTable.Columns.Remove("Column5");
   smallTable.Columns.Remove("Column6");
   smallTable.Columns.Remove("Column13");
   smallTable.Columns.Remove("Column16");

   return smallTable;
}

工作正常。但我在寻找是否有更好的方法。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用linq将DataTable转换为IEnumerableSelect个必填字段,如下所示:

var myValues = dataTable1.AsEnumerable()
                         .Select(x => new  { col1 = x["Column1"], col2 = x["Column2"]..});
dataGridView.DataSource = myValues;

答案 1 :(得分:1)

您的代码无法正常运行,因为您所做的只是参考smallTable分配变量dataTable1,并从原始表格对象中删除列

Linq的写作速度更快,但这是您想要了解的问题:

DataTable smallTable = dataTable1.Clone(); // Copy data structure
// Now you can remove your columns
smallTable.Columns.Remove("Column2");
......
foreach (var row in dataTable1.Rows) // iterate all rows 
{
    var newRow = smallTable.NewRow();
    foreach (var col in smallTable.Columns) // and iterate only needed columns
    {
        newRow[col.ColumnName] = row[col.ColumnName];
    }
}

这几乎是Linq的糖衣。

答案 2 :(得分:0)

DataView dv = new DataView(dataTable1);
DataTable smallTable = dv.ToTable(true, new string[] { "Column2", "Column5"...});

https://social.msdn.microsoft.com/Forums/en-US/ac2c7c95-66d6-4db6-a6fb-4dccd5fa701e/is-there-a-better-way-to-get-subtable-with-selected-columns-of-a-datatable?forum=adodotnetdataset

托梅尔。