I have problems with redrawing child controls of cloned panel.
First, I'm not using IClonable. I'm using reflection.
My code:
public static Panel ClonePanel(Panel panel)
{
Panel newPanel = (Panel) CloneControl(panel);
foreach (Control ctl in panel.Controls)
{
Control newCtl = CloneControl(ctl);
newCtl.Visible = true;
newPanel.Controls.Add(newCtl);
}
newPanel.Visible = true;
return newPanel;
}
public static Control CloneControl(Control o)
{开发者_StackOverflow社区
Type type = o.GetType();
PropertyInfo[] properties = type.GetProperties();
Control retObject = (Control) type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null);
foreach (PropertyInfo propertyInfo in properties)
{
if (propertyInfo.CanWrite)
{
propertyInfo.SetValue(retObject, propertyInfo.GetValue(o, null), null);
}
}
return retObject;
}
For your second issue, add a reference to System.Design. Then add the [Deisgner(typeof( ParentControlDesigner)] attribute to your user control. That will let it act like a panel control at design time.
So, I solved it by using UserControl instead of Panel, which turned out to be much, much better.
The only thing I would like to have additionally, is designing UserControl controls not only in its specific designer, but also in Form itself. But it's not a problem, I can live with that.
精彩评论