private DataTable InsertABlankRow(DataTable dt)
{
int n = dt.Rows.Count;
DataTable dtnew = new DataTable();
if (dt.Columns.Contains("colname"))
{
var countRows = dt.Select("colname ='xyz'").Length;
if (countRows > 1)
{
foreach (DataRow drow in dt.Rows)
{
if (drow["colname"].ToString() == "xyz")
{
int index = dt.Rows.IndexOf(drow);
dt.Rows.InsertAt(dt.NewRow(), index + 1);
dt.AcceptChanges();
}
}
}
}
}
修改后的代码:
private DataTable Add_a_Row(DataTable dtnew)
{
DataTable dt = new DataTable();
dt= dtnew.Clone();
foreach (DataRow dr in dtnew.Rows)
{
dt.ImportRow(dr);
if(dr["colname"].ToString()=="xyz")
{
dt.Rows.Add(dt.NewRow());
}
}
return dt;
}
大家好, 我试图在满足条件的多个地方插入空行。第一次满足条件时,会添加一个新的空行,但对于第二个,它会抛出异常,集合已更改。有没有办法以更好的方式做到这一点。谢谢......
答案 0 :(得分:1)
你不能修改你循环的同一个集合.foreach中的集合应该是不可变的。
在foreach (DataRow drow in dt.Rows)
内,您不应该更改 dt.Rows.InsertAt 。这打破了每一个,比如你循环第二个项目,现在你在第二和第二行插入另一行移到第三个。现在你再次循环到第二个。
答案 1 :(得分:0)
每次添加行时,for循环条件中的行集合都会更改,因此您将收到该特定错误。你应该尝试递归这样的东西:
void AddRowInDatatable(Datatable dt)
{
foreach (DataRow drow in dt.Rows)
{
if (drow["colname"].ToString() == "xyz")
{
int index = dt.Rows.IndexOf(drow);
dt.Rows.InsertAt(dt.NewRow(), index + 1);
AddRowInDatatable(dt);
}
}
}
使用此方法替换for循环。正如@Bhuban指出的那样,它可能是一个无限循环,但你可能会得到这个想法。进一步修改代码,因为我没有测试过,只是把它写出了我的想法
答案 2 :(得分:0)
private DataTable InsertABlankRow(DataTable dt)
{
int n = dt.Rows.Count;
DataTable dtnew = dt.Copy();
if (dt.Columns.Contains("colname"))
{
var countRows = dt.Select("colname ='xyz'").Length;
if (countRows > 1)
{
for(int i =0; i< dtnew.Rows.Count; i++)
{
if (dtnew.Rows[i]["colname"].ToString() == "xyz")
{
dt.Rows.InsertAt(dt.NewRow(), i+1);
}
}
dt.AcceptChanges();
}
}
return dt;
}
基本上我已经制作了传递数据表的副本并存储在名为dtnew的新数据表中。使用for循环遍历dtnew datatable的每一行,因为这样我可以获得可以提供索引的变量值,并将新行插入原始数据表。
答案 3 :(得分:0)
这是在枚举时从集合中删除或插入项目的常见问题。
通常的解决方案是以相反的顺序索引集合:
for (int i = list1.Count - 1; i >= 0; i--)
list1.RemoveAt(i);
另一个解决方案是创建另一个集合:
foreach (var item in list1)
list2.Add(item);
最简单且效率最低的解决方案是枚举集合的副本:
foreach (var item in list1.ToList())
list1.Remove(item);