2012-04-22 13 views
7

संभव डुप्लिकेट:
It is possible to copy all the properties of a certain control? (C# window forms)क्लोन नियंत्रण - सी # (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

सामान्यतया आप एक नया उदाहरण के लिए एक वस्तु के सार्वजनिक संपत्तियों को कॉपी करने के प्रतिबिंब का उपयोग कर सकते हैं।

नियंत्रणों से निपटने के दौरान, आपको सावधान रहना होगा। विंडोटाइटल जैसे कुछ गुण केवल फ्रेमवर्क आधारभूत संरचना द्वारा उपयोग किए जाने के लिए हैं; इसलिए आपको उन्हें फ़िल्टर करने की आवश्यकता है।

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; 
    } 
} 
बेशक

, आप अभी भी समायोजित करने की आवश्यकता नामकरण, स्थान इत्यादि भी निहित नियंत्रण संभाल लें।