2012-04-22 18 views
7

Duplicar posible:
It is possible to copy all the properties of a certain control? (C# window forms)Controles Clon - C# (Winform)

tengo que crear algunos controles similares a un control creada como tiempo de diseño. El control creado debe tener las mismas propiedades que un control predefinido, o en otras palabras, quiero copiar un control. ¿Hay una sola línea de código para ese propósito? o tengo que configurar cada propiedad por una línea de código? que estoy haciendo en este momento es:

 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; 

Respuesta

17

En términos generales se puede utilizar la reflexión para copiar las propiedades públicas de un objeto a una nueva instancia.

Sin embargo, cuando se trata de controles, debe tener cuidado. Algunas propiedades, como WindowTarget, están destinadas a ser utilizadas solo por la infraestructura del marco; entonces necesitas filtrarlos.

Después del trabajo se realiza el filtrado, se puede escribir la deseada de una sola línea:

Button button2 = button1.Clone(); 

Aquí hay un poco de código para empezar:

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

Por supuesto, usted todavía tiene que ajustar nombres, ubicación, etc. También puede manejar controles contenidos.