将控件动态添加到面板时的奇怪行为

时间:2013-12-14 01:43:30

标签: vb.net

[使用VB.NET 2010 / Winforms]

注意:我的实际项目比下面发布的代码复杂得多(下面的代码只是重现奇怪行为所需的最小测试用例)。

OK ...在Designer中,我在一个名为“ContainerA”和“ContainerB”的表单上放置了两个大小相同的面板,并带有一个按钮(Button1)。我在ContainerA内放了5个小彩色面板(名为RedPanel,BluePanel,GreenPanel等)。

ContainerB内没有任何东西。

我正在尝试做的事情,在Button1点击后,动态地将ContainerA中的所有5个小彩色面板放入ContainerB中。简单吧?但由于一些奇怪的原因,它只将那些面板的 3 放入ContainerB! (它将剩余的2个面板留在ContainerA内!

这里到底发生了什么?这是我用.NET编写的多年来见过的最奇怪的事情之一!

以下是按钮点击事件的代码......

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

    For Each ColorBlock As Panel In ContainerA.Controls
        ContainerB.Controls.Add(ColorBlock)
    Next

End Sub

有什么想法吗?我在我的真实项目和上面发布的简单测试项目中得到了同样的奇怪(意外)行为,所以在VB中发生了一些奇怪的事情。

希望有人可以对此有所了解,所以我可以不停地将我可怜的头撞在墙上试图找出解决方案! :/

1 个答案:

答案 0 :(得分:2)

您正在从正在循环的集合中删除控件,因此一旦删除了超过一半的控件,循环将退出。为防止这种情况,请向后循环控件:

For i As Integer = ContainerA.Controls.Count - 1 To 0 Step -1
    Dim ColorBlock As Control = Panel1.Controls(i)
    ContainerB.Controls.Add(ColorBlock)
Next