【问题标题】:c# adding row that already belongs to a datatablec#添加已经属于数据表的行
【发布时间】:2015-02-22 09:07:55
【问题描述】:

我有一个数据表DTgraph,该数据表有一个名为Campaign 的列。该列可能具有三个唯一值之一,它们是 IVR, City, City2`。所以行是这样的:

我有一个数据表有这种格式的数据

........ IVR........

.........IVR........

**.........IVR........**

.........City1......

.........City1......

**.........City1......**

.........City2......

.........City2......

**.........City2......**

我想获取该列每个唯一值的最后一行,换句话说,我想获取粗体的行。我几乎做了所有这样的事情:

var cRows = new Dictionary<string, DataRow>(StringComparer.InvariantCultureIgnoreCase);

foreach (DataRow oRow in DTgraph.Rows)
{
    var sKey = oRow["Campaign"].ToString();

    if (!cRows.ContainsKey(sKey))
    {
        cRows.Add(sKey, oRow);
    }
    else
    {
        cRows[sKey] = oRow;
    }
}

var oNewTable = DTgraph.Clone();

foreach (var oRow in cRows.Values)
{
    oNewTable.Rows.Add(oRow);
}

如您所见,我将数据放入字典中,最后将字典转移到数据表中。

我的问题是在这一行:

cRows.Add(sKey, oRow);

我收到一个错误:

该行已经属于另一个数据表

注意:我需要解决这个异常,我不需要一种新的方式来实现我的目标

注意:我错了,例外在这一行

oNewTable.Rows.Add(oRow);

【问题讨论】:

标签: c# datatable


【解决方案1】:

说实话,我不是 100% 理解你的问题,但是要解决这个异常:

该行已经属于另一个数据表。

变化:

oNewTable.Rows.Add(oRow);

收件人:

oNewTable.ImportRow(oRow);

或者创建一个新行并克隆 ItemArray。

foreach (var oRow in cRows.Values)
{
    var newRow = oNewTable.NewRow();
    newRow.ItemArray = oRow.ItemArray.Clone() as object[];
    oNewTable.Rows.Add(newRow);
}

【讨论】:

  • 我错了,我更正了问题,我在抛出异常的那一行错了,请你检查一下
  • @MarcoDinatsoli 那是我修好的那行,你看答案了吗?
  • 我正在尝试,请稍等。数据库在云端,我正在等待许可,最多 4 分钟
【解决方案2】:

使用新表的NewRow() 函数,然后使用oRow.ItemArray 属性从源行获取值并将它们复制到新创建行的ItemArray。一个例子是:

Array.Copy(oRow.ItemArray, oNewTable.NewRow().ItemArray, oRow.ItemArray.Length)

但是,请记住,这不会保留源行的原始值和当前状态(我认为您无论如何都不会在这里使用)。如果这些事情很重要,请选择ImportRow() 解决方案,它在复制时保留源行的状态。

【讨论】:

  • 我错了,我更正了问题,我在抛出异常的那一行错了,请你检查一下
  • @MarcoDinatsoli:那是你需要用我上面写的代码替换的行。你试过了吗?
  • 加一个,我希望我能接受超过答案,非常感谢您的努力。欣赏它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
相关资源
最近更新 更多