【问题标题】:DataTable overwrites previous rowDataTable 覆盖前一行
【发布时间】:2017-04-07 03:34:02
【问题描述】:

所以我试图向DataTable 添加一些行,但由于某种原因,它似乎覆盖了前一行。我怎样才能防止这种情况发生。

我目前拥有的是这段代码:

DataTable table = new DataTable();

foreach (CallData data in p.ValueArray)
{
    DataRow row = table.NewRow();
    foreach (CallParm parm in data.Parm)
    {
        if (!table.Columns.Contains(parm.Name))
        {
            table.Columns.Add(parm.Name, typeof(string));
        }
        row[parm.Name] = parm.Value;
    }
    table.Rows.Add(row);
}

数据示例:

{
    ValueArray: [
        {
            Parm: [
                {
                    Name: "ID",
                    Value: 1
                },
                {
                    Name: "ID",
                    Value: 2
                },
                {
                    Name: "ID",
                    Value: 4
                }
            ]
        }
    ]
}

数据结果

"ID": 4

想要的结果

"ID": 1
"ID": 2
"ID": 4

我已经检查过它是否按照应有的方式通过循环,那里没有问题。当我们添加行时,问题似乎发生了

【问题讨论】:

  • 如果前一行有相同的 param.Name 它被覆盖(row[parm.Name] = parm.Value;)。你想实现什么?你想从 ValueArray 中添加所有项目?
  • 所以最后你的 DataTable 中只有一行,但 ValueArray 中有多个项目?
  • @mybirthname:没错
  • @MichaelTotKorsgaard 您的输入对象不适合您的成就,您需要有 3 个“Parm”和 1 个“Name,Value”对才能有 3 行。
  • 发生这种情况是因为您具有相同的参数名称,因此您正在覆盖该值。我给你写了如何为你的情况做这件事

标签: c# datatable overwrite


【解决方案1】:

您需要添加来自 Param 的所有值,而不仅仅是最后一个。你可以这样试试

 DataTable table = new DataTable();

foreach (CallData data in p.ValueArray)
{
    DataRow row = table.NewRow();
    foreach (CallParm parm in data.Parm)
    {
        if (!table.Columns.Contains(parm.Name))
        {
            table.Columns.Add(parm.Name, typeof(string));
        }
        row[parm.Name] = parm.Value;
        //now you add all items in this loop not only last element.
        table.Rows.Add(row);
    }

}

【讨论】:

    猜你喜欢
    • 2017-11-19
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2022-01-24
    • 1970-01-01
    • 2018-10-19
    • 2012-04-09
    相关资源
    最近更新 更多