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

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

收藏已修改;枚举操作可能无法执行

我不知道确切的原因。

4

3 回答 3

3

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

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

然后只获取列中 value 所在的行Test并将false它们放在 a 中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()

于 2015-01-03T07:46:36.867 回答
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;
    }
}
于 2015-01-03T07:34:32.910 回答
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;
    }
}
于 2015-03-31T06:22:09.540 回答