我不明白为什么这段代码不起作用。

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}
有帮助吗?

解决方案

虽然 DataRow.Delete 不修改集合的状态, 微软文档 声明您不应在迭代集合时调用它:

在迭代 DataRowCollection 对象时,不应在 foreach 循环中调用 Delete 或 Remove。删除或删除都会修改集合的状态。

最好的解决方案通常是创建一个单独的集合(例如A List<DataRow>)要删除的项目,然后将其删除 你已经完成迭代了。

这也是您想要从集合中删除项目的情况的解决方案,因为 .NET 中的大多数集合不允许您在迭代集合时更改集合的内容。

其他提示

最安全的方式 - 使用for

for (int i = datatable.Rows.Count - 1; i >= 0; i--) 
{
    if (true)
    {
        datatable.Rows[i].Delete();
    }
}

不要忘了 AcceptChanges 以除去所有标记的行:

datatable.AcceptChanges();

您不能当您使用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();
}

如果你调用delete方法,你只需要调用您正在修改表AcceptChanges(),foreach循环之后。

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}

dataTable.AcceptChanges();

删除方法简单地标记为删除行。

HTTP: //msdn.microsoft.com/en-us/library/system.data.datarow.delete%28v=VS.90%29.aspx

可能是我的回答不再有用。 在使用的foreach DataRow的异常抛出只出现在NET 2.0和更早的版本,原因是在描述MSDN 的http:// MSDN。 microsoft.com/en-us/library/system.data.datarow.delete(v=vs.80).aspx

如果该行的RowState的添加,该行被从表中删除。

在的RowState您使用Delete方法之后变为已删除。直到调用acceptChanges它保持删除。

一个已删除的行可以通过调用RejectChanges取消删除。

通过此问题可以调用使用的foreach之前DataTable.AcceptChanges()

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}

dataTable.AcceptChanges();

请参阅快照以了解其工作原理。

  1. 刚刚删除但未从数据表中删除。

enter image description here

  1. AcceptChanges() 函数之前的断点。enter image description here
  2. 执行 AcceptChanges() 函数后。enter image description here

我希望这个问题现在得到解决。

Rows内容改变,而你是迭代如果删除一行,这使得迭代无效。

您可以,但是,第一行复制到一个集合,然后遍历集合并删除行的方式。这可以确保迭代不通过改变数据来迭代中断。

最简单的方法通过使用清单之外的映射要删除的行,然后删除行的DataTable迭代实现这一目标。

C#

    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

有是其他版本的软件(我认为更容易),我只是用:

int i=0;
while (i < myDataTable.Rows.Count)
{
    if (condition)  //should it be deleted?
        myDataTable.Rows.RemoveAt(i);
    else
        i++;
}

此更快。

仅适用于谁正在寻找特定的场景像我这样的人, 我需要缩短拍摄时间,并且一旦一些有用的信息来源是从每一行中提取,我通过为已删除标记排除的行。

希望这有助于有人...

foreach (DataRow dataRow in dataTable.Rows)
{
    if (dataRow.RowState != DataRowState.Deleted)
    {
        if (your condition here)
        {
            dataRow.Delete();
        }
    }
}

这适用于几乎任何集合。如果试图删除一个项目,同时通过收集循环,你将有一个问题。例如,如果删除行#3,则前行#4成为行#3。

如果项目有Count,这是我做了什么:

int Count = myTable.Rows.Count;

while (Count > 0) // replace condition with myTable.Rows.Count if unconditionally performed on all rows
{
    DataRow row = myTable.Rows[0] // or however you want to find your index

    // do some work
    myTable.Rows.Remove(row);

    // if you want to perform a check to break out of while
    if (someCondition)
        Count = 0;
    else
        Count = myTable.Rows.Count;
}

请注意,即其中对象具有.GetXXXX()收集,像FileInfo(这个), 在一个foreach删除项内容是可接受的。一种解决方案我已考虑是创建扩展方法,该方法提供了一种方法.GetItems()

使用这样的:

for (int i = 0; i < myDataTable.Rows.Count; i++)

{

 myDataTable[i].Delete();

}

这是因为它看起来像尝试拆解的楼梯,你攀登的台阶。简单地说,你无法删除的项目你迭代。

因此应该使用不同的阵列,以迭代和从数据表Rows属性中删除它们。

foreach (DataRow dataRow in dataTable.Select())
{
    if (true)
    {
        dataTable.Rows.Remove(dataRow);
    }
}

不确定Magents

这是我如何做它和正常工作

dt = GetStationeryConsolidationDetails(txtRefNo.Text);
int intRows = dt.Rows.Count;
int x = 0;
for (int c = 0; c < intRows; c++)
{
  if (dt.Rows[c - x]["DQTY"].ToString() == "0")
  {
    dt.Rows[c - x].Delete();
    dt.AcceptChanges();
    x++;        
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top