Каждая вторая строка попала во время For Each в DataGridViewRow с помощью команды Удалить - PullRequest
1 голос
/ 14 июня 2011

Предположим, у меня есть DataGridView с именем gridFiles.

For Each row as DataGridView in gridFiles.Rows
    MsgBox(row.Cells("somekey").Value.ToString)
    gridFiles.Rows.Remove(row)
Next

. Я буду видеть окна сообщений, но только для каждой другой строки.Я думаю, что происходит, что внутренний указатель для gridFiles.Rows сбивается, потому что на следующей итерации меньше строк.

Мне нужно пройти по каждой строке и условно решить, удалять их или нет (в зависимости от успеха или неудачи другого действия).

Как обойти эту проблему?1010 *

Ответы [ 2 ]

4 голосов
/ 14 июня 2011
dim deleteList As new List(Of DataGridViewRow)
For Each row as DataGridViewRow in gridFiles.Rows
    MsgBox(row.Cells("somekey").Value.ToString)
    deleteList.Add(row)
Next
For Each row As DataGridViewRow in deleteList 
   gridFiles.Rows.Remove(row)
Next

Или, верните коллекцию назад

For i As Integer = gridFiles.Rows.Count - 1 To 0 Step -1
    MsgBox(row.Cells("somekey").Value.ToString)
    gridFiles.Rows.Remove(gridFiles.Rows(i))
End If
2 голосов
/ 14 июня 2011

Когда вы перебираете коллекцию gridFiles.Rows и удаляете из этой коллекции, вы нарушаете саму коллекцию, и итерация работает не так, как должна (foreach пытается получить следующее значение, но индекс изменился из-за элемента, который был удален) оставив вам оценку «каждый второй».

решение (или решение, есть другие способы сделать это скином) состоит в том, чтобы поместить элементы, которые нужно удалить, в свою собственную коллекцию, а после цикла foreach выполнить цикл по коллекции itemsToBeRemoved и удалить эти элементы из оригинальная коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...