Ответ 1
Вместо dt1.Rows
используйте dt1.Select()
Целью здесь является не использование самой коллекции, а массив из строки, которая не является коллекцией Rows
У меня есть таблица данных, и я хочу удалить строку здесь, это мой код, который бросает мне исключение
foreach (DataRow row in dt1.Rows)
{
if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook"))
{
row.Delete();
dt1.AcceptChanges();
}
}
Я даже пробовал вне stat if, а внешний forloop по-прежнему бросает мне сообщение об ошибке, чтобы понять, как достичь этой задачи, это исключение, которое я получаю:
Collection was modified; enumeration operation might not execute.
Окончательный рабочий код:
foreach (DataRow row in dt1.Select())
{
if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook"))
{
row.Delete();
}
}
Вместо dt1.Rows
используйте dt1.Select()
Целью здесь является не использование самой коллекции, а массив из строки, которая не является коллекцией Rows
Создайте список строк для удаления во время итерации по DataTable.Rows
, затем удалите их все отдельно.
Решение, отличное от LINQ:
List<DataRow> rowsToDelete = new List<DataRow>();
foreach (DataRow row in dt1.Rows)
{
if ((row["Name"] == "Select a Lookbook") ||
(row["Name"] == "Create a new Lookbook"))
{
rowsToDelete.Add(row);
}
}
foreach (DataRow row in rowsToDelete)
{
row.Delete();
}
dt1.AcceptChanges();
Решение LINQ:
List<DataRow> rowsToDelete = dt1.Rows.AsEnumerable()
.Where(row => (row["Name"] == "Select a Lookbook") ||
(row["Name"] == "Create a new Lookbook"))
.Tolist();
foreach (DataRow row in rowsToDelete)
{
row.Delete();
}
dt1.AcceptChanges();
Вот как я это сделал, когда столкнулся с этой проблемой.
Dim index As Integer = 0
Dim count As Integer = resultsDT.Rows.Count - 1
For i As Integer = 0 To count
If resultsDT.Rows(index).Item("something") = "something" Then
resultsDT.Rows(index).Delete()
resultsDT.AcceptChanges()
index = index - 1
End If
index = index + 1
i = i + 1
Next