无法从 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;
}
}
这是我从数据表中删除行的代码:
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;
}
}