這個主題只是一個小觀念,一個反向思考的小觀念而已!不過很多人都碰過這個問題,至少很多人問過我這個問題!

現在ListBox的資料為:

aaa

bbb

ccc

ddd

eee

fff

現在我們想要在 這個ListBox 中移除多個項目時,aaa / bbb / ddd 

很多人會這麼寫: 【錯的】

Dim i As Integer
For i = 0 To List1.ListCount - 1
If List1.Selected(i) = True Then
List1.RemoveItem i
End If
Next
使用一個迴圈,逐一檢查每一個項目,如果選取狀態是 True 就移除該項目,看起來好像是對的,但其實上面的程式錯了二個地方!說明如下:

錯一:

List1.list(0) 是指 aaa 這個項目,已選取,應移除。
List1.list(1) 是指 bbb 這個項目,已選取,應移除。
List1.list(2) 是指 ccc 這個項目,未選取,不移除。
List1.list(3) 是指 ddd 這個項目,已選取,應移除。


 i=0 時,List1.Selected(i) = True,所以會移除 aaa 這個項目,aaa 這個項目移除後,這時,bbb 這個原本 index  1的項目,index 變成了 0,而 ccc 這個項目的 index 就變成了 1 了!

所以,當 i=1 時,List1.Selected(i) 是指 ccc 這個項目,而不是 bbb 這個項目了!所以,bbb 這個項目被跳過去了,沒檢查到,當然也沒有機會被移除了!

 

 

錯二:
迴圈還沒執行完時,就會出錯了,錯誤訊息如下:

執行階段錯誤 '381':
不正確的屬性陣列索引值

為什麼呢?For i = 0 To List1.ListCount - 1是指 index  0  5,共會做 6 次。但是由於您在程式中已經移除某些項目,所以當您做到 i=4 時,結果已經如圖二, List1 中只剩下 4 個項目而已,那來 index=4 的項目讓您執行下面這行指令呢?

If List1.Selected(4) = True Then

所以錯誤訊息就是 不正確的屬性陣列索引值 了!

解法:

要解決這個問題相當簡單!原來的程式只要稍微修改就可以了!如下:

Dim i As Integer
For i = List1.ListCount - 1 To 0 Step -1
If List1.Selected(i) = True Then
List1.RemoveItem (i)
End If
Next
 
【由後往前做,當您移除 index 在後面的項目時,並不會動到前面任何項目的排列順序!】

arrow
arrow
    全站熱搜

    kingjoy1235 發表在 痞客邦 留言(0) 人氣()