自動目錄
前言
假設有一個ComboBox選單,選項為0 ~ 200(共201項)
ComboBox1.Items.Add(i)
Next
需要從第0項,檢核到最後一項
當中只要是"小於20"的選項都必須移除(使用ComboBox1.Items.Remove())
實作
If ComboBox1.Items(i) < 20 Then
ComboBox1.Items.Remove(i)
End If
Next
看起來很簡單
使用for迴圈,i 從 0 到 ComboBox1.Items.Count - 1 (i = 0 ~ 200)
直接跑一圈,途中發現數值 < 20 的話,就將該項目移除(ComboBox1.Items.Remove(i))
不過執行後,卻發現......
出錯了,看來是索引值超出上限
因為在途中移除清單選項的話,ComboBox的索引上限也會跟著減少
原本ComboBox最大索引是200
中間假設移除了10項,索引極限為190
當 for 迴圈的 i 跑到第191的時候,便會出錯
再度挑戰
For i = 0 To ComboBox1.Items.Count - 1
If ComboBox1.Items(j) < 20 Then
ComboBox1.Items.RemoveAt(j)
Else
j += 1
End If
Next
解決此問題,只要多宣告一個變數 j 即可
j = 0 代表固定移除清單第一個選項
如果for迴圈途中遇到不想移除的選項,就執行j += 1
之後便會跳過,改從第二個選項開始移除
問題解決~
程式碼分享
如果覺得上面的解釋太抽象,自己執行一遍,是最快的學習途徑
重點在摸熟程式碼的流向,也可以觀察變數 i 、j 是怎麼變化的
開新專案,將底下程式碼完整複製貼上至後端
(前端不須新增控制項)
即可執行
Public Class Form1
Public ComboBox1 As New ComboBox
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'前端控制項宣告
Me.Size = New Size(300, 260)
ComboBox1.Location = New Point(75, 90)
Me.Controls.Add(ComboBox1)
'選單賦值,新增選項0 ~ 200
For i = 0 To 200
ComboBox1.Items.Add(i)
Next
'錯誤寫法
'For i = 0 To ComboBox1.Items.Count - 1
' If ComboBox1.Items(i) < 20 Then
' ComboBox1.Items.Remove(i)
' End If
'Next
Dim j = 0
For i = 0 To ComboBox1.Items.Count - 1
If ComboBox1.Items(j) < 20 Then
ComboBox1.Items.RemoveAt(j)
Else
j += 1
End If
Next
End Sub
End Class