我有一个包含多个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是否能解决问题。
答案 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
}
}