Clone Controls – C # (Winform)

Possibile duplicato:
È ansible copiare tutte le proprietà di un determinato controllo? (Forme della finestra C #)

Devo creare alcuni controlli simili a un controllo creato come tempo di progettazione. Il controllo creato dovrebbe avere le stesse proprietà di un controllo predefinito o, in altre parole, voglio copiare un controllo. C’è una singola riga di codice per questo scopo? o devo impostare ogni proprietà con una riga di codice? Sto facendo adesso è:

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; 

In generale è ansible utilizzare reflection per copiare le proprietà pubbliche di un object in una nuova istanza.

Tuttavia, quando si ha a che fare con i controlli, è necessario essere cauti. Alcune proprietà, come WindowTarget, sono pensate per essere utilizzate solo dall’infrastruttura del framework; quindi è necessario filtrarli.

Dopo che il lavoro di filtraggio è terminato, puoi scrivere il one-liner desiderato:

 Button button2 = button1.Clone(); 

Ecco un piccolo codice per iniziare:

 public static class ControlExtensions { public static T Clone(this T controlToClone) where T : Control { PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); T instance = Activator.CreateInstance(); foreach (PropertyInfo propInfo in controlProperties) { if (propInfo.CanWrite) { if(propInfo.Name != "WindowTarget") propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null); } } return instance; } } 

Ovviamente, devi ancora modificare i nomi, la posizione, ecc. Inoltre, forse gestisci i controlli contenuti.