2015-01-03 187 views
3

這是我的代碼從數據表刪除行:當我使用上面的代碼行被刪除無法從數據表中刪除行

DataTable dtapple = dt; 

foreach (DataRow drapplicant in dtapple.Rows) 
{ 
    int iapp = Convert.ToInt32(drapplicant["SrNo"].ToString()); 

    if (drapplicant["PassportExpDate"].ToString().Trim() != "") 
    { 
     //ViewState["iapp"] = drapplicant; 
     dtapple.Rows.Remove(drapplicant); 
    } 
} 

現在,但經過我得到一個錯誤

收集被修改;枚舉操作可能不會執行

我不知道確切的原因。

+0

[錯誤數據行的可能重複,集合被修改;枚舉操作可能不會執行](http://stackoverflow.com/questions/15457571/error-in-datarow-collection-was-modified-enumeration-operation-might-not-execut) –

+0

鏈接問題的解決方案是可怕的。用臨時DataTables和嵌套循環: - \ – t3chb0t

+0

那麼,你有沒有解決它? – t3chb0t

回答

0

下面的代碼工作對我來說:

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    var tempRow = dataTable.Rows[i]; 
    var temp = dataTable.Rows[i][0]; 
    for (int j = 0; j < dataTable.Rows.Count; j++) 
    { 
     DataRow rows = dataTable.Rows[j]; 
     if (temp == rows[0].ToString()) 
     { 
      tempdatatable.Rows.Add(tempRow[0], tempRow[1]); 
      dataTable.Rows.Remove(rows);  //Update happen here 
     } 
     tempdatatable.DefaultView.Sort = "gscitations DESC"; 
     dataGridView1.DataSource = tempdatatable; 
    } 
} 
0

試試這個:

for (int i = 0; i < dataTable.Rows.Count; i++) 
{ 
    var tempRow = dataTable.Rows[i]; 
    var temp = dataTable.Rows[i][0]; 
    for (int j = 0; j < dataTable.Rows.Count; j++) 
    { 
     DataRow rows = dataTable.Rows[j]; 
     if (temp == rows[0].ToString()) 
     { 
      tempdatatable.Rows.Add(tempRow[0], tempRow[1]); 
      dataTable.Rows.Remove(rows);  //Update happen here 
     } 
     tempdatatable.DefaultView.Sort = "gscitations DESC"; 
     dataGridView1.DataSource = tempdatatable; 
    } 
} 
+0

其不工作 – Bhupendra

+0

你在哪裏得到錯誤? –

+0

當循環再次返回時 – Bhupendra

1

,因爲雖然它遍歷集合不能改變你得到這個錯誤。要從集合中刪除某些項目,通常需要第二個迭代集合,而不更改它。

對於您的DataTable,您需要首先獲取要刪除的行並將其放入新集合中。實現這一目標的方法之一是LINQ

讓我們創建一些測試數據:

DataTable dt = new DataTable(); 
dt.Columns.Add("Test", typeof(bool)); 
DataRow dr1 = dt.NewRow(); 
DataRow dr2 = dt.NewRow(); 
DataRow dr3 = dt.NewRow(); 

dr1["Test"] = true; 
dr2["Test"] = false; 
dr3["Test"] = false; 

dt.Rows.Add(dr1); 
dt.Rows.Add(dr2); 
dt.Rows.Add(dr3); 

則只能得到行,其中在Test列值是false,並把它們放在一個List<DataRow>

var removeRows = 
    dt 
    .AsEnumerable() 
    .Where(r => (bool)r["Test"] == false) 
    .ToList(); 

現在您可以迭代新的removeRows列表並從第一個集合中刪除它的項目(這裏是DataTable.Rows

// Remove selected rows. 
foreach (var row in removeRows) 
{ 
    dt.Rows.Remove(row); 
} 

在你的這個查詢應該工作:

var removeRows = 
    dtapple 
    .AsEnumerable() 
    .Where(r => string.IsNullOrEmpty(r["PassportExpDate"].ToString()) == false) 
    .ToList(); 

如果使用string.IsNullOrEmpty()沒有必要Trim()它。

+0

我在哪裏放這個代碼? – Bhupendra

+0

對不起,我錯過了條件並更新了示例。 – t3chb0t