2012-04-22 113 views
7

可能重复:
It is possible to copy all the properties of a certain control? (C# window forms)克隆控制 - C#(WinForm的)

我要创建一个类似的设计时创建一个控制一些控件。创建的控件应该与预定义的控件具有相同的属性,换句话说,我想复制一个控件。有没有用于此目的的单行代码?或者我必须通过一行代码来设置每个属性? 我现在正在做正确的是:

 ListContainer_Category3 = new FlowLayoutPanel(); 
     ListContainer_Category3.Location = ListContainer_Category1.Location; 
     ListContainer_Category3.BackColor = ListContainer_Category1.BackColor; 
     ListContainer_Category3.Size = ListContainer_Category1.Size; 
     ListContainer_Category3.AutoScroll = ListContainer_Category1.AutoScroll; 

回答

17

一般来说,你可以使用反射对象的公共属性复制到一个新的实例。

但是,在处理控件时,您需要谨慎。一些属性,如WindowTarget仅用于框架基础结构;所以你需要过滤出来。筛选工作完成

后,您可以输入所需的一行:

Button button2 = button1.Clone(); 

这里有一个小的代码,让你开始:

public static class ControlExtensions 
{ 
    public static T Clone<T>(this T controlToClone) 
     where T : Control 
    { 
     PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     T instance = Activator.CreateInstance<T>(); 

     foreach (PropertyInfo propInfo in controlProperties) 
     { 
      if (propInfo.CanWrite) 
      { 
       if(propInfo.Name != "WindowTarget") 
        propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null); 
      } 
     } 

     return instance; 
    } 
} 

当然,你仍然需要调整命名,位置等。也可以处理包含的控件。