为何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
相关产品推荐
相关产品推荐

