2012-04-22 17 views
7

Powiel możliwe:
It is possible to copy all the properties of a certain control? (C# window forms)Kontrole Clone - C# (Winform)

muszę stworzyć pewne kontrole podobne do kontroli utworzonego w czasie projektowania. Utworzona kontrola powinna mieć takie same właściwości jak predefiniowana kontrola lub innymi słowy chcę skopiować kontrolkę. Czy istnieje jakiś pojedynczy wiersz kodu do tego celu? lub muszę ustawić każdą właściwość za pomocą linii kodu? Robię teraz to:

 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; 

Odpowiedz

17

Generalnie można wykorzystać odbicie skopiować właściwości publiczne obiektu do nowej instancji.

Jednak w przypadku Kontroli należy zachować ostrożność. Niektóre właściwości, takie jak WindowTarget, mają być używane tylko przez infrastrukturę szkieletową; więc musisz je odfiltrować.

Po pracy Filtrowanie odbywa, można wpisać żądane jedno-liner:

Button button2 = button1.Clone(); 

tutaj jest trochę kodu do należy zacząć:

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

Oczywiście, trzeba jeszcze, aby dostosować nazewnictwo, lokalizacja itp. Może również obsługiwać zawarte kontrolki.