从DataSet中的DataTable中删除一行

时间:2011-08-31 09:56:29

标签: c# listview row

我有一个包含多个DataTables的DataSet。我在ListView中显示DataTables(当我编写代码时我不知道数据绑定)。无论如何,我想从DataSet中的DataTables中删除行。

我试过这个:

foreach (DataRow row in dsData.Tables["Table1"].Rows)
  {
     //find the row that contains the username I'm after
     if (item.SubItems[2].Text == row["LoginName"].ToString())            
       {
         dsData.Tables["Table1"].Rows.Remove(row); //<- main code of interest
       }
  }

我也试过

dsData.Tables["Table1".Rows.Delete(row);

我遇到的问题是,当你删除一行时,我得到了异常:

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

根据我的理解,因为当你从ListView中删除一行时,它下方的行会向上移动并导致所有这些麻烦。代码本身做了它应该做的事情,但是当你运行它时看到异常并不好。

我准备用DataGridView重写整个类,但如果可能的话,宁愿纠正那一行:)。

编辑:我甚至不确定DataGridView是否能解决问题。

5 个答案:

答案 0 :(得分:4)

将循环更改为for循环向后计数,这样就不会收到该消息。

for(int i = dsData.Tables["TAble1"].Rows; i > 0; i--)
{
     if(item.SubItems[2].Text == dsData.Tables["Table1"].Rows[i - 1]["LoginName"].ToString())
         dsData.Tables["Table1"].Rows.Remove(i - 1)
}

答案 1 :(得分:1)

尝试:

        DataSet dsData = new DataSet();
        List<DataRow> rowsToDelete = new List<DataRow>();

        foreach (DataRow row in dsData.Tables["Table1"].Rows)
        {
            if (item.SubItems[2].Text == row["LoginName"].ToString())
            {
                rowsToDelete.Add(row);
            }
        }

        foreach(DataRow row in rowsToDelete)
        {
            dsData.Tables["Table1"].Rows.Remove(row); 
        }

答案 2 :(得分:1)

如果您要移除东西,则需要向后循环 (explanation of why here

for (int i = dsData.Tables["Table1"].Rows.Count - 1; i >= 0; i--)
{
    DataRow row = dsData.Tables["Table1"].Rows[i];

    //find the row that contains the username I'm after
    if (item.SubItems[2].Text == row["LoginName"].ToString())            
    {
        dsData.Tables["Table1"].Rows.Remove(row); //<- main code of interest
    }
}

答案 3 :(得分:0)

通常,您无法从迭代中的集合中删除集合中的项目 您可以做的是保留要删除的所有行的列表(在循环中创建它)并在循环外删除所有行

答案 4 :(得分:0)

您无法使用foreach循环从循环内部修改正在迭代的集合。这样做:

for (int i = 0; i < dsData.Tables["Table1"].Rows.Count; i++)
  {
     DataRow row = dsData.Tables["Table1"].Rows[i];
     if (item.SubItems[2].Text == row["LoginName"].ToString())            
       {             
         dsData.Tables["Table1"].Rows.Remove(row); //<- main code of interest
       }
  }