2012-04-22 26 views
7

Olası Çoğalt:
It is possible to copy all the properties of a certain control? (C# window forms)Klon Kontrolleri - C# (Winform)

ben tasarım süresi olarak oluşturulan bir kontrole benzer bazı denetimler oluşturmak zorunda. Oluşturulan kontrol önceden tanımlanmış bir kontrol ile aynı özelliklere sahip olmalı ya da başka bir deyişle bir kontrolü kopyalamak istiyorum. Bu amaç için tek bir kod satırı var mı? ya da her özelliği bir kod satırına göre ayarlamalıyım? Ben şu anda yapıyorum geçerli:

 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; 

cevap

17

Genellikle yeni bir örneğine bir nesnenin kamu özelliklerini kopyalamak için yansıma kullanabilirsiniz konuşma. Bununla birlikte, Kontrollerle uğraşırken, dikkatli olmanız gerekir. WindowTarget gibi bazı özellikler yalnızca çerçeve altyapısı tarafından kullanılmalıdır; Bu yüzden onları filtrelemeniz gerekiyor.

Button button2 = button1.Clone(); 

İşte başlangıç ​​için biraz kod: filtreleme çalışması yapılır

sonra, istenen tek astar yazabilir Tabii

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; 
    } 
} 

, hala ayarlamak gerekir adlandırma, konum vb.