无法从 DataTable 中删除行,因为 "Collection was modified; enumeration operation might not execute"

Cannot remove rows from DataTable because "Collection was modified; enumeration operation might not execute"

这是我从数据表中删除行的代码:

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

现在,当我使用上面的代码时,该行被删除,但之后我得到一个错误

Collection was modified; enumeration operation might not execute

我不知道具体原因。

试试这个:

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

您收到此错误是因为集合在迭代时不得更改。要从集合中删除某些项目,您通常需要在不更改的情况下迭代第二个集合。

对于您的 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()

下面的代码适合我:

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