You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何foreach循环结束后DataTable中添加的行消失?

解决DataTable动态添加行后无内容的问题

我一眼就看出问题所在啦——你从头到尾只创建了一行,在foreach循环里一直在修改这同一行的数据,但从来没把它添加到DataTable的Rows集合里!循环结束后,这行只是个游离的“临时行”,并没有被真正加入表格,所以最后表格自然是空的。

问题根源拆解

看你的两段代码,都犯了同一个错误:

  • 把var row = dt.NewRow();放在了foreach循环外面,导致整个循环都在复用同一行对象
  • 循环过程中只修改行的字段值,从未调用dt.Rows.Add(row)将行正式加入表格

修正后的核心代码(第一个案例)

summaryTable.Columns.Add("StationName", typeof(string));
summaryTable.Columns.Add("DepartmentCode", typeof(string));

// 把行的创建移到foreach循环内部,每次迭代生成新行
foreach (var item in issuesByClass)
{
    var row = summaryTable.NewRow(); // 每次循环新建一行
    row.SetField("StationName", item.StationName);
    row.SetField("DepartmentCode", item.DepartmentCode);

    foreach (var itemClass in item.Lookup)
    {
        if (!itemClassLookup.ContainsKey(itemClass.Key)) continue;
        var itemClassValue = itemClassLookup[itemClass.Key];
        // 确保列未重复添加
        if (!summaryTable.Columns.Contains(itemClassValue))
        {
            summaryTable.Columns.Add(itemClassValue, typeof(decimal));
        }
        row.SetField(itemClassValue, itemClass.Sum());
    }

    if (!summaryTable.Columns.Contains("GrandTotal"))
    {
        summaryTable.Columns.Add("GrandTotal", typeof(decimal));
    }
    row.SetField("GrandTotal", item.GrandTotal);
    
    // 关键步骤:将配置好的行添加到DataTable的Rows集合中
    summaryTable.Rows.Add(row);
}

return summaryTable;

修正后的WinForm示例代码

public Form1()
{
    this.InitializeComponent();
    this.Test();
}

public void Test()
{
    var dt = new DataTable();
    var subs = new[] { "Sub 1", "Sub 2", "Sub 3" };

    // 提前创建列,避免循环内重复判断(可选,但更高效)
    if (!dt.Columns.Contains("Subs"))
    {
        dt.Columns.Add("Subs");
    }
    dt.Columns.Add("Test");

    foreach (var sub in subs)
    {
        var row = dt.NewRow(); // 每次循环新建一行
        row.SetField("Subs", sub);
        row.SetField("Test", 1M);
        dt.Rows.Add(row); // 将行加入表格
    }

    this.dataGridView1.DataSource = dt;
}

关键注意事项

  • 每次循环必须创建新的DataRow对象,不能复用同一行
  • 配置完行的所有字段后,一定要调用DataTable.Rows.Add(row)完成行的添加
  • 列的创建可以提前放在循环外(如果能确定列名),或者在循环内做存在性判断,避免重复添加列

内容的提问来源于stack exchange,提问作者user8166711

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:35:57