2012-04-22 56 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; 
    } 
} 

當然,你仍然需要調整命名,位置等。也可以處理包含的控件。