private void buttonCopy_Click(object sender, EventArgs e)
{
// der Clone deiner GroupBox liegt nach dem Clonen über deinem Original(!), also verschiebe sie um den Effekt zu sehen
int i = 0;
System.Collections.ArrayList listAllControls = new System.Collections.ArrayList();
// die GroupBox ist der Startpunkt und muss zuerst zur Liste(listAllControls) hinzugefügt werden:
listAllControls.Add(groupBox1);
while (i < listAllControls.Count)
{
// hier werden alle Controls berücksichtigt, die in deinem Haupt-Control stecken:
Control controlOriginal = (Control)listAllControls[i];
if (controlOriginal.HasChildren)
listAllControls.AddRange(controlOriginal.Controls);
i++;
// jetzt das Clonen vom aktuellen Control (controlCurrent):
Control controlCloned = (Control)TypeDescriptor.CreateInstance(null, controlOriginal.GetType(), null, null);
foreach(PropertyDescriptor property in TypeDescriptor.GetProperties(controlOriginal.GetType()))
if(property.ShouldSerializeValue(controlOriginal))
property.SetValue(controlCloned, property.GetValue(controlOriginal));
}
}