在数据表中插入多个或单个毛坯

时间:2017-06-27 17:38:27

标签: c# datatable

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;
    }

大家好, 我试图在满足条件的多个地方插入空行。第一次满足条件时,会添加一个新的空行,但对于第二个,它会抛出异常,集合已更改。有没有办法以更好的方式做到这一点。谢谢......

4 个答案:

答案 0 :(得分:1)

你不能修改你循环的同一个集合.foreach中的集合应该是不可变的。

foreach (DataRow drow in dt.Rows)内,您不应该更改 dt.Rows.InsertAt 。这打破了每一个,比如你循环第二个项目,现在你在第二和第二行插入另一行移到第三个。现在你再次循环到第二个。

请参阅此SO postthis了解更多

答案 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)

这是在枚举时从集合中删除或插入项目的常见问题。

  1. 通常的解决方案是以相反的顺序索引集合:

    for (int i = list1.Count - 1; i >= 0; i--)
        list1.RemoveAt(i);
    
  2. 另一个解决方案是创建另一个集合:

    foreach (var item in list1)
        list2.Add(item);
    
  3. 最简单且效率最低的解决方案是枚举集合的副本:

    foreach (var item in list1.ToList())
        list1.Remove(item);