[VB.NET] ComboBox 使用For迴圈移除項目

URL Link //n.sfs.tw/15621

2022-03-02 15:53:41 By 大塚 宏

前言

假設有一個ComboBox選單,選項為0 ~ 200(共201項)

For i = 0 To 200
    ComboBox1.Items.Add(i)
Next

需要從第0項,檢核到最後一項

當中只要是"小於20"的選項都必須移除(使用ComboBox1.Items.Remove())

實作

For i = 0 To ComboBox1.Items.Count - 1
    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的時候,便會出錯

再度挑戰

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

解決此問題,只要多宣告一個變數 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