[使用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中发生了一些奇怪的事情。
希望有人可以对此有所了解,所以我可以不停地将我可怜的头撞在墙上试图找出解决方案! :/
答案 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