不理解从面板中删除控件

时间:2013-08-30 18:22:16

标签: vb.net

我有一个面板,面板上有大约六个控件。我想从面板中删除控件,最后使用MyPanel.Clear()。但在此之前,我尝试了以下从单击按钮运行的代码:

    For Each b As Control In MyItem.MyPanel.Controls

        MyItem.MyPanel.Controls.Remove(b)

    Next

我会点击按钮并观看它,以及调试中的MyItem.MyPanel.Controls.Count。当它经历时,计数将减少:从5到4到3,然后它将退出。如果我再次单击该按钮,它将再删除两个,然后在第三次单击时删除最后一个按钮,这样它们都符合条件并且全部删除而不更改任何内容。为什么需要三次点击?我想,我显然在这里遗漏了一些简单的东西,但我不知道它是什么,我真的很想理解它。如果我必须删除特定的控件,看起来我会遇到问题。

3 个答案:

答案 0 :(得分:2)

奇怪的是,VB.NET甚至允许你这样做,但基本上你正在做的是编辑你正在迭代的集合。为了更好地理解,假设您正在使用1到6的常规for循环,在第一次迭代中,您将删除对象1,留下5个对象,使旧的2号对象成为第一个。下一次迭代你删除第二个东西,曾经是第三个,依此类推。大多数语言都是运行时错误。

答案 1 :(得分:2)

我自己遇到了这个问题,奇怪的是它甚至可以让你这样做,因为你正在修改你所指的循环中的集合。这应该是一个更好的方法。
如果您想根据类型

删除它们
For i = Panel1.Controls.Count - 1 To 0 Step -1
    If TypeOf Panel1.Controls(i) Is Label Then
        Panel1.Controls.Remove(Panel1.Controls(i))
    End If
Next

答案 2 :(得分:0)

发生的事情是您从第一个位置开始删除控件并移动到最后一个位置。如果列表中有6条记录并且您开始删除它们,那么以编程方式表示:

remove(0)
remove(1)
...
remove(5)

当你这样做时,名单越来越小。删除第一个项目后,它会从6个位置下降到5个,然后是4个,然后是3个,等等。因此,在代码中途,它会尝试删除位置3(第4个项目)的项目,但由于您已经删除了3个项目,因此列表为大小只包含3个项目,并且该位置不存在。

要正确删除它们,您必须从列表的后面开始并移到前面。

也许是这样的:

For i As Integer = (MyItem.MyPanel.Controls.Count- 1) To 0 Step -1
    MyItem.mypanel.Controls(i).Dispose()
Next