2017-06-27 23 views
0
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(); 
        } 
       } 
      } 
     } 
} 

修改後的代碼:插入多個或單個blankrows在一個DataTable

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

我認爲在使用InsertAt方法在特定索引處插入行後,應該調用AcceptChanges方法。 dt.AcceptChanges() –

+0

我這樣做,可能不會顯示在代碼中,但即使添加後仍會引發錯誤。 – Agasthya

+0

您無法修改您正在枚舉的集合。該foreach被搞砸了,因爲它開始的原始收藏現在已經改變。 –

回答

0

每次添加一行時,for-loop條件中的行集合都會發生變化,因此您會得到該特定錯誤。你應該嘗試像這樣遞歸:

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-loop。正如@Bhuban指出的那樣,它可能是一個無限循環,但你可能會明白。修改代碼進一步,因爲我沒有測試過,只是寫了我的心

+0

我想知道這會如果dt行colname具有xyz –

+0

或者只是使用for循環而不是foreach循環,那麼該循環就是無限循環。你必須小心使用循環索引,但是你沒有綁定枚舉枚舉規則。 – exceptionthrown

+0

@BhubanShrestha你可能是對的,我只是給他一個模糊的主意。 –

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

基本上我已經通過數據表的副本,並存儲在新的DataTable dtnew調用。循環訪問dtnew數據表的每一行,因爲這樣我得到了可以提供索引的變量值,並將新行插入到原始數據表中。

1

你不能修改你正在循環的同一個集合。foreach中的集合應該是不可變的。

裏面foreach (DataRow drow in dt.Rows),你不應該改變dt.Rows.InsertAt。這打破了每一個,說你正在循環第二個項目,現在你在第二和第二行插入另一行移動到第三。現在你再次循環第二。

請參閱本SO postthis更多

+0

我修改了我的代碼,如上所示,但我再次遇到了chaged行索引的問題。任何關於這個的指針。 – Agasthya

+0

我自己實際得到了答案,它的工作原理如上所示。謝謝大家的投入。 – Agasthya

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