“无法通过行”尝试从我的数据表中删除未使用的行来删除已删除的行信息

时间:2013-04-17 17:23:42

标签: c# datatable delete-row

我正在抓取数据,将其粘贴到DataTable中,并将其显示在绑定到该表的DataGridView中。我试图这样做,以便删除当前抓取中未包含的数据表中的数据。我这样做:

public void FillTable(DataTable table, IEnumerable<MyObject> readings)
{
    var currentReadingsNames = new List<string>();
    var lastParent = string.Empty;
    var index = 0;

    foreach (var reading in readings)
    {
        if (reading.ParentName != lastParent)
        {
            lastParent = reading.ParentName;
            index = 0;
        }
        LoadRow(table, reading, index++);
        currentReadingsNames.Add(MakeKey(reading));
    }

    //Iterate through the rows in our data table. If the row is not one we just loaded, get rid of it.
    foreach (DataRow row in table.Rows)
    {
        if (!currentReadingsNames.Contains(MakeKey(row["ParentID"].ToString(), row["ID"].ToString())))
        {
            row.Delete();
        }
    }
    table.EndLoadData();
}

MakeKey(reading)MakeKey(properties)返回一个字符串,我可以使用它以两种不同的方式识别我的对象。假设这有效。

当我跑步时,我得到:

  

无法通过该行访问已删除的行信息。

我觉得我不应该尝试访问已删除的行,因为我只在查看其值(parentIDID列)后才删除该行。这种行为与我理解的不同吗?任何想法为什么会这样?如果这段代码应该有效,可能错误就在其他地方,但我没有改变任何其他内容,所以我会感到惊讶(我正在尝试添加这种删除行为)。

1 个答案:

答案 0 :(得分:12)

只需为已删除的行添加过滤器:

foreach (DataRow row in table.Rows)
{
    if(row.RowState != DataRowState.Deleted) 
    {     
       if (!currentReadingsNames.Contains(MakeKey(row["ParentID"].ToString(), row["ID"].ToString())))
            {
                row.Delete();
            }
        }
    }