C# 遍历Windows窗体上的控件

C# 遍历Windows窗体上的控件,c#,winforms,controls,C#,Winforms,Controls,我似乎有一些奇怪的问题,我相信这将是一件简单的事情。我有一个Windows窗体,在窗体上有一个名为MainPanel的面板,在MainPanel内部,我有另一个面板,里面有一个按钮,标签在MainPanel内部,但不在第二个面板中。2控制。我试图做的是将MainPanel中的所有控件复制到另一个panel对象。我使用以下C#代码来执行此操作: GUIPanel gp = new GUIPanel(); foreach (System.Windows.Forms.Control ctrl in g

我似乎有一些奇怪的问题,我相信这将是一件简单的事情。我有一个Windows窗体,在窗体上有一个名为MainPanel的面板,在MainPanel内部,我有另一个面板,里面有一个按钮,标签在MainPanel内部,但不在第二个面板中。2控制。我试图做的是将MainPanel中的所有控件复制到另一个panel对象。我使用以下C#代码来执行此操作:

GUIPanel gp = new GUIPanel();
foreach (System.Windows.Forms.Control ctrl in gp.Controls["MainPanel"].Controls)
{
    m_OptionsControl.Controls.Add(ctrl);
}

当我运行此代码时,它会用按钮复制面板,但不会复制标签。更奇怪的是,当我设置一个断点并通过调试器运行它时,我在即时窗口中键入“?gp.Controls[“MainPanel”].Controls.Count”,它会返回2,就像它应该返回的一样。但是,在单步执行代码时,它只执行一次foreach循环。我在这里遗漏了什么?

无法复制WinForms控件;您的代码无法正常工作。
将控件添加到第二个面板时,它将从第一个面板中删除

您可以使用反向
for
循环移动所有控件。
可以通过创建每个控件的新实例并复制所有属性来复制控件

编辑:例如:

for (int i = MainPanel.Controls.Count - 1; i >= 0; i--) {
    MainPanel.Controls[i].Parent = m_OptionsControl;
}

搬家是我想要的。你有没有一个例子来说明你所说的反向for循环是什么意思?