Почему эта подпрограмма не работает? (vb.net DataGridView странность) - PullRequest
1 голос
/ 22 сентября 2009
For Each row As DataGridViewRow In DGV.Rows
                    DGV.Rows.RemoveAt(CInt(row.Index.ToString))
                Next

Приведенный выше код удалит все остальные строки

For i As Integer = 0 To 7 Step 1
                For Each row As DataGridViewRow In DGV.Rows
                    DGV.Rows.RemoveAt(CInt(row.Index.ToString))
                Next
            Next

Этот код избавляется от всего (DGV имеет, во время вызова подпрограммы, 250 строк)

DGV - это объект DataGridView, который отображается.

Чего я не понимаю, так это того, что первый не сработает.

Чтобы уточнить, я использовал CInt(row.Index.ToString) вместо row.Index, потому что row.Index, похоже, не работает сам по себе, но CInt(row.Index.ToString) работает.

Я также пробовал такие вещи, как:

For i As Integer = 0 To DGV.Rows.Count Step 1
        DGV.Rows.RemoveAt(i)
    Next

Это также не сработало.

Я даже пытался использовать фактическое число 250 вместо DGV.Rows.Count в последнем примере, но с теми же результатами, оно ВСЕГДА пропускает все остальные. Я подумал, что, повторяя цикл еще несколько раз, я мог очистить все это, поэтому я использовал метод проб и ошибок, пока не получился 7 итераций в качестве магического числа.

Может кто-нибудь объяснить мне эту странность?

Ответы [ 4 ]

3 голосов
/ 22 сентября 2009

Если у вас есть пять элементов в сетке / списке, что угодно, и удалите элемент, остальные элементы перемещаются вверх:

1
2
3
4
5

Становится при удалении третьего предмета:

1
2
4
5

Таким образом, если вы удалите третий и четвертый элементы из (1,2,3,4,5), вы удалите значения 3 и 5.

Начать с конца списка и перейти к элементу 0.

for i = list.count - 1 to 0 step -1
    list.removeAt( i )
next
1 голос
/ 22 сентября 2009

Просто предположение, но вы меняете коллекцию строк, по которой вы перебираете. В первый раз вы удаляете строку с индексом 0. Это перемещает все элементы строки на один индекс вверх, поэтому старый индекс 1 теперь находится на новом индексе 0 с оставшимися 249 элементами. Во второй раз в цикле вы удаляете строку с индексом 1, но есть строка с индексом 0. Продолжайте повторять, и вы получите только половину элементов.

Попробуйте

for n = 0 to dgv.rows.count
     dgv.rows.removeat(0)
next

, если вы хотите удалить все.

0 голосов
/ 22 сентября 2009

Вы изменяете коллекцию, которую вы перебираете, поэтому не удивительно, что она не работает должным образом.

Что еще более удивительно, так это то, что вам вообще удается перебирать коллекцию при ее изменении. Для любой другой коллекции Enumerator будет недействительным при изменении коллекции, но, похоже, коллекция Rows работает иначе.

Тем не менее, даже если вам удастся выполнить итерацию коллекции при ее изменении, она не будет работать должным образом. Когда вы удаляете элемент с индексом 0, следующий элемент занимает его место. Затем, когда вы продолжаете удалять элемент с индексом 1, это элемент, который изначально был с индексом 2. Это оставляет каждый второй элемент в коллекции, когда вы просматриваете их.

Чтобы удалить элементы по одному, вы можете выполнить петлю в обратном направлении, поэтому при удалении элемента это не влияет на положение любого другого элемента:

For i As Integer = DGV.Rows.Count -1 To 0 Step -1
   Dgv.Rows.RemoveAt(i)
Next

Вы также можете удалить элемент с индексом 0, если остались какие-либо элементы:

While Dgv.Rows.Count > 0
   Dgv.Rows.RemoveAt(0)
End While

Однако самый простой способ удалить все элементы - это, конечно, вызвать метод Clear:

Dgv.Rows.Clear()
0 голосов
/ 22 сентября 2009

Ваше утверждение о первом примере кода неверно. row.Index уже является целым числом, вам не нужно вызывать ToString для него, а затем преобразовывать его обратно в Int с CInt.

Если вы действительно хотите удалить все, попробуйте DGV.Rows.Clear ()

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