【问题标题】:Delete Controls inside GroupBox删除 GroupBox 内的控件
【发布时间】:2011-05-14 22:01:37
【问题描述】:

我创建了一个组框,然后在运行时用按钮填充它。我还创建了一个按钮,比如 Button1 来循环遍历 groupbox 并删除这些按钮。这是我的代码 对于 Button1:

Public Sub removeControls()
    For Each ctrl As Control In GroupBox1.Controls
        GroupBox1.Controls.Remove(ctrl)
        ctrl.Dispose()
    Next 
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    removeControls()
End Sub

执行时,它只删除 GroupBox1 内的一些控件,而不是全部。您能解释一下我的代码中缺少什么以使其正常工作吗?谢谢。

【问题讨论】:

    标签: vb.net winforms controls groupbox


    【解决方案1】:

    当您删除 For Each 循环中的控件时,您实际上是在修改您试图循环通过的集合。当您删除集合中的第一项时,第二项上升成为第一。但是现在,当您到达循环的第二个索引时,第三个​​ 项就在它的位置。您实际上已跳过删除第二项,只删除了第一项和第三项。以此类推贯穿整个循环。

    相反,您需要以 reverse 顺序遍历控件并删除每个索引处的项目。通过从末尾开始删除项目,您不会影响项目的顺序或位置。

    所以,只需将您的方法更改为以下内容:

    Public Sub RemoveControls()
        For i As Integer = (GroupBox1.Controls.Count - 1) To 0 Step -1
            Dim ctrl As Control = GroupBox1.Controls(i)
            GroupBox1.Controls.Remove(ctrl)
            ctrl.Dispose()
        Next i
    End Sub
    

    【讨论】:

      【解决方案2】:

      您在遍历集合时正在更改集合,不应该这样做。

      宁可使用类似的东西

      For i As Integer = GroupBox1.Controls.Count - 1 To 0 Step -1
          Dim ctrl As Control = GroupBox1.Controls(i)
          GroupBox1.Controls.Remove(ctrl)
          ctrl.Dispose()
      Next
      

      【讨论】:

        猜你喜欢
        • 2011-07-11
        • 2015-01-03
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多