我不明白为什么这段代码不起作用。
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
我不明白为什么这段代码不起作用。
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
最安全的方法-使用 for
循环
for (int i = datatable.Rows.Count - 1; i >= 0; i--)
{
if (true)
{
datatable.Rows[i].Delete();
}
}
别忘了使用AcceptChanges
方法来移除所有标记的行:
datatable.AcceptChanges();
if (true)
是一个占位符,用于检查是否需要删除该行。否则,您的数据表中的所有行都将被删除。 - VMAtmDataRow.Delete
不会修改集合的状态,但微软文档指出,在迭代 DataRowCollection 对象时不应调用 Delete 或 Remove 方法:
在迭代 DataRowCollection 对象时,不应调用 Delete 或 Remove 方法。Delete 和 Remove 方法都会修改集合的状态。
通常最好的解决方法是创建另一个集合(例如 List<DataRow>
)来存储要删除的元素,然后在迭代完成后再删除它们。
大多数 .NET 中的集合都不允许在遍历时改变集合中的内容,因此这也适用于从集合中删除元素的情况。
使用 foreach
语句迭代集合时,您不能修改该集合。
您可以尝试类似以下的操作:
List<DataRow> deletedRows = new List<DataRow>();
foreach (DataRow dataRow in dataTable.Rows)
{
if(true) deletedRows.Add(dataRow);
}
foreach(DataRow dataRow in deletedRows)
{
dataRow.Delete();
}
for(int i = datatable.Rows.length - 1; i >= 0; i --) { //remove rows }
- AllenGSelect()
方法会创建一个包含先前集合中所有行的新集合。你没有在包含要删除的行的原始集合上进行迭代。 - Thibault FaliseAcceptChanges()
方法即可。foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
我的回答可能已经不再有用了。在.NET 2.0及更早版本中,只有在使用DataRow时才会抛出异常。原因请参考msdn:http://msdn.microsoft.com/en-us/library/system.data.datarow.delete(v=vs.80).aspx
如果行的RowState为Added,则该行将从表中删除。
在调用Delete方法后,RowState变为Deleted。它保持为Deleted状态直到您调用AcceptChanges方法。
可以通过调用RejectChanges来取消删除的行。
为了解决这个问题,您可以在使用foreach之前调用DataTable.AcceptChanges()。
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
Rows
属性中删除它们。// Select() method returns an array and you can iterate through while remove
foreach (DataRow row in dataTable.Select())
{
if (true)
{
dataTable.Rows.Remove(row);
}
}
List<DataRow> rowsWantToDelete= new List<DataRow>();
foreach (DataRow dr in dt.Rows)
{
if(/*Your condition*/)
{
rowsWantToDelete.Add(dr);
}
}
foreach(DataRow dr in rowsWantToDelete)
{
dt.Rows.Remove(dr);
}
VB
Dim rowsWantToDelete As New List(Of DataRow)
For Each dr As DataRow In dt
If 'Your condition' Then
rowsWantToDelete .Add(dr)
End If
Next
For Each dr As DataRow In rowsWantToDelete
dt.Rows.Remove(dr)
Next
Rows
内容在您进行迭代时会发生更改,如果删除一行,则迭代将无效。
但是,您可以先将行复制到集合中,然后再迭代该集合并以此方式删除行。这确保了迭代不会被更改的数据中断。
这里有另一个版本(我认为更容易理解)我刚刚使用了:
int i=0;
while (i < myDataTable.Rows.Count)
{
if (condition) //should it be deleted?
myDataTable.Rows.RemoveAt(i);
else
i++;
}
更快速。