2009-09-21 56 views
1
For Each row As DataGridViewRow In DGV.Rows 
        DGV.Rows.RemoveAt(CInt(row.Index.ToString)) 
       Next 

上面的代碼將刪除每隔一行這個子程序爲什麼不工作? (vb.net DataGridView的怪胎)

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次迭代結束爲幻數。

有人可以向我解釋這種古怪嗎?

回答

3

如果你有一個GridView /列表框五個項目,無論和刪除的項目外,其餘項目動起來:

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 
+0

這樣做,謝謝! – Cyclone 2009-09-21 23:33:38

1

這裏只是一個猜測,但你正在改變你正在迭代的行集合。第一次通過時,您刪除索引0處的行。這會將所有行項移動到一個索引,因此舊索引1現在位於新索引0處,剩下249個項目。通過循環第二次,您將刪除索引1處的行,但索引0處仍有一行。請繼續重複,並且您只會獲得一半物品。

嘗試

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

,如果你想刪除一切。

0

您對第一個代碼示例的斷言是錯誤的。 row.Index已經是一個Integer,你不需要在它上面調用ToString,然後把它轉換回帶有CInt的Int。

如果你真的要刪除一切,嘗試DGV.Rows.Clear()

+0

這種方法在這種情況下不起作用,因爲我不希望它明確地清楚每一行,這只是我給出的例子。 – Cyclone 2009-09-21 23:34:34

0

您正在改變您遍歷集合,所以這不是很奇怪,它不能正常工作。

更令人驚訝的是,您實際上設法在改變集合時迭代集合。對於任何其他集合,枚舉器將在您更改集合時失效,但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()