【问题标题】:Move complete column from one Data Table to other C#将完整列从一个数据表移动到另一个 C#
【发布时间】:2013-07-06 19:14:44
【问题描述】:

我需要在两个数据表之间实现列移动功能。假设我在 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);          

    }

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

【问题讨论】:

  • 这看起来像复制列和复制数据的不那么复杂复杂的工作。你试过什么?你在哪里卡住了?
  • 我尝试了下面的 void ShiftColumn(DataTable source, DataTable dest, string colname) { var result = source.AsEnumerable().Select(row => row.Field(colname)); dest.Columns.Add(colname); DataTable dt = source.DefaultView.ToTable(false, colname); pd.合并(dt); } }
  • 我尝试获取用户选择的列名,并使用 linq 查询获取与该列相关的数据,然后与目标表合并。猜测合并在这里不是正确的选择。 void ShiftColumn(DataTable source, DataTable dest, string colname) { var result = source.AsEnumerable().Select(row => row.Field(colname)); dest.Columns.Add(colname); DataTable dt = source.DefaultView.ToTable(false, colname); dest.Merge(dt); } } 我是初学者,所以请提出其他建议。
  • 请编辑您的原始问题以添加更多信息。 cmets中的代码很难阅读
  • 修改了问题,谢谢。

标签: c# wpf datagridview datatable dynamic-columns


【解决方案1】:

以前我做过这个。我不得不手动编写数据表复制的代码。下面的方法将丢失的列从源表复制到目标表。它返回被复制的列名的集合。 第二个函数将数据从源列复制到目标列。它将主键列名作为输入和必须复制数据的列名列表。

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;
            }
        }
    }
}

【讨论】:

  • 谢谢;我从代码中得到了很多线索。这对我很有帮助。
【解决方案2】:

检查数据表是否有复制选项, 喜欢 数据表 dt = 新数据表() dt.copy 要么 dt.克隆

【讨论】:

  • 试过了;但是我们可以只复制特定的列吗?我的要求是用户可以转移,或者我们可以将列和列数据抓取到一个列表中并创建一个嵌套的列列表,然后绑定到网格?这样会好吗?
  • 数据列 dc = dt.column[3];现在添加 dt2.columns.add(dc)
  • 如果上述方法不起作用,您可以轻松删除不需要的列。 dt.columns.Romve("列名")
  • 我们可以简单地做一些像 DataTable table1 = new DataTable(); table1.Columns.Add("A"); table1.Columns.Add("B"); table1.Columns.Add("C");数据表 table2 = table1.Clone(); table2.Columns.Remove("A");
  • @Ravuthasamy,我在之前的评论中提出了同样的建议
猜你喜欢
  • 2012-04-07
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多