2

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

    For Each b As Control In MyItem.MyPanel.Controls

        MyItem.MyPanel.Controls.Remove(b)

    Next

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

4

3 回答 3

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
于 2013-08-30T18:35:44.747 回答
2

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

于 2013-08-30T18:26:37.867 回答
0

发生的事情是您从第一个位置开始删除控件并移动到最后一个位置。如果列表有 6 条记录并且您开始像以前一样删除它们,那么您就是在说:

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

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

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

也许是这样的:

For i As Integer = (MyItem.MyPanel.Controls.Count- 1) To 0 Step -1
    MyItem.mypanel.Controls(i).Dispose()
Next
于 2013-08-30T18:33:00.393 回答