【发布时间】:2013-05-13 11:48:42
【问题描述】:
在一个类中编写一个快速子例程,在 VB.NET 中将控件从一个 Panel 移动到另一个,这看起来很简单:
Public Sub Move(ByRef OldPanel As System.Windows.Forms.Panel)
Dim panelControl As System.Windows.Forms.Control
For Each panelControl In OldPanel.Controls
MessageBox.Show(panelControl.Name) 'Debugging
OldPanel.Controls.Remove(panelControl) 'Fairly certain this line makes no difference
NewPanel.Controls.Add(panelControl)
Next
End Sub
问题是,它只移动了大约一半的控件。其他面板根本不会被循环拾取并保持绑定到OldPanel。我已经验证这些控件绝对是OldPanel 的一部分(而不仅仅是在视觉上漂浮在它上面)。
例如,如果面板上有 6 个控件,MessageBox.Show(panelControl.Name) 只反馈其中的 3 个,并且只有这 3 个控件移动。这……令人费解。
我在表单类 _Load 事件本身中编写了一个类似的调试循环,这正确地选取了面板上的所有 6 个控件:
Dim panelControl As System.Windows.Forms.Control
For Each panelControl In Me.Panel1.Controls
MessageBox.Show(panelControl.name)
Next
有什么想法吗?
【问题讨论】:
-
您在循环遍历集合时正在更改集合;这是自找麻烦。
-
啊哈,好收获。实际上,大概就是这样。
标签: vb.net winforms foreach controls