将完整列从一个Datatable移动到另一个C#

时间:2013-07-09 08:50:31

标签: c# wpf datagridview datatable dynamic-columns

我需要在两个数据表之间实现列移位功能。假设我在DataTable 1中有{A,B,C}列,在DataTable 2中有{A}。

如果我想将列{B,C}移动到DataTable 2,我该怎么做?两个表中的数据应该相似。

如果DataTable不是正确的选项,那么请帮助我了解我们如何实现这一目标。

可以使用List>完成吗 - 嵌套列表?尝试下面的代码,但认为合并不是正确的选择。

  private void move(DataTable source, DataTable dest, string colname)
    {
        var result = source.AsEnumerable().Select(row => row.Field<string>(colname));
        dest.Columns.Add(colname);
        DataTable dt = source.DefaultView.ToTable(false, colname);

        dest.Merge(dt);          

    }

我是初学者,所以请建议是否有其他方法我们可以根据用户选择来移动列。

2 个答案:

答案 0 :(得分:0)

检查数据表是否有复制选项, 喜欢 DataTable dt = new DataTable() dt.copy 要么 dt.clone

答案 1 :(得分:0)

有时我回来了。我不得不手动编写数据表副本的代码。下面的方法可以将缺少的列从源表复制到目标表。它返回已复制的列名集合。 第二个函数将数据从源列复制到目标列。它将主键列名称作为输入,并列出必须复制数据的列名称。

public List<string> CopyDistinctColumns(DataTable source, DataTable target)
{
    var copiedColumn = new List<string>();
    for(var x = 0; x < source.Columns.Count; x++)
    {
        var column = source.Columns[x];
        if(!target.Columns.Contains(column.ColumnName))
        {
            var newCol = new DataColumn
            {
                ColumnName = column.ColumnName,
                DataType = column.DataType,
                Caption = column.Caption,
                DefaultValue = column.DefaultValue,
                MaxLength = column.MaxLength,
            };
            copiedColumn.Add(column.ColumnName);
            target.Columns.Add(newCol);
        }
    }
    return copiedColumn;
}

public void CopyData(DataTable source, DataTable target, string primaryKeyColumnName, List<string> copiedColumns)
{
    for (var i = 0; i < source.Rows.Count; i++)
    {
        var row = source.Rows[i];
        var primaryKeyValue = row[primaryKeyColumnName];
        for (var j = 0; j < target.Rows.Count; j++)
        {
            var trow = target.Rows[j];
            if (trow[primaryKeyColumnName].Equals(primaryKeyValue))
            {
                foreach (var col in copiedColumns)
                {
                    trow[col] = row[col];
                }
                break;
            }
        }
    }
}