2010-05-07 10 views
20

मैं समझाने की कोशिश करूंगा कि मैं क्या कर रहा हूं। मुझे इसके लिए तकनीकी शब्द नहीं पता है, इसलिए यहां जाता है:कस्टम नियंत्रण में डिज़ाइन समर्थन को कैसे सक्षम करें?

उदाहरण 1: यदि मैं किसी फॉर्म पर एक सूची दृश्य डालता हूं और कुछ कॉलम जोड़ता हूं, तो मैं डिज़ाइन-टाइम में क्लिक-एंड-ड्रैग करने में सक्षम हूं स्तंभों का आकार बदलने के लिए।

उदाहरण 2: अब, मैं उपयोगकर्ता नियंत्रण में एक सूची दृश्य रखता हूं और इसे "MyCustomListView" (और शायद इसे किसी भी तरीके से बढ़ाने के लिए कुछ विधि जोड़ता हूं) नाम देता हूं।

यदि मुझे पता है कि फ़ॉर्म पर "MyCustomListView" है, तो मैं कॉलम हेडर को डिज़ाइन-टाइम में आकार देने के लिए क्लिक-एंड-ड्रैग करने में असमर्थ हूं।

क्या ऐसा आसानी से करने का कोई तरीका है? का कुछ रूप "क्लिक-एंड-ड्रैग इवेंट को अंतर्निहित नियंत्रण में पास करें और उस नियंत्रण को अपना जादू करें"। मैं वास्तव में रिकोड करना नहीं चाहता हूं, बस माउसक्लिक (या जो भी हो) पर पास करें और इस मामले में, ListView प्रतिक्रिया दें जैसा कि उपरोक्त पहले उदाहरण में किया गया था।

उत्तर

47

विंडोज फॉर्म डिजाइनर ने अधिकांश नियंत्रणों के लिए डिजाइनर कक्षाएं समर्पित की हैं। ListView के लिए डिज़ाइनर System.Windows.Forms.Design.ListViewDesigner, System.Design.dll असेंबली में एक आंतरिक वर्ग है। यह वर्ग आपको कॉलम हेडर खींचने की क्षमता देता है।

उपयोगकर्ता नियंत्रक System.Windows.Forms.Design.ControlDesigner डिज़ाइनर क्लास का उपयोग करता है। यह कुछ खास नहीं करता है, सिर्फ ड्रैग हैंडल के साथ नियंत्रण के चारों ओर एक आयताकार रखता है। आप देख सकते हैं कि यह कहां जा रहा है: जब आप अपने उपयोगकर्ता को किसी फॉर्म पर नियंत्रण डालते हैं, तो यह कंट्रोल डिज़ाइनर होता है जिसका उपयोग कक्षा को डिज़ाइन करने के लिए किया जाता है, ListViewDesigner चित्र में नहीं है। इस प्रकार आप कॉलम हेडर खींचने की क्षमता खो देते हैं। यह भी ध्यान रखें कि नियंत्रण डिज़ाइनर यूसी के अंदर नियंत्रण तक पहुंच नहीं देता है।

हालांकि यह आपके स्वयं के डिजाइनर को बनाकर ठीक करने योग्य है। प्रोजेक्ट्स के साथ शुरू करें + संदर्भ जोड़ें, सिस्टम का चयन करें। डिज़ाइन करें। सूची दृश्य का पर्दाफाश करने के लिए आपको यूसी में एक सार्वजनिक संपत्ति जोड़नी होगी और बदली गई संपत्तियों को सहेजने की अनुमति देने के लिए [DesignerSerializationVisibility] विशेषता लागू करें। और डिफ़ॉल्ट डिजाइनर को प्रतिस्थापित करने के लिए यूसी कक्षा में [डिजाइनर] विशेषता लागू करें। यह सब इस सदृश चाहिए (डिफ़ॉल्ट नाम और एक ListView कि "कर्मचारियों" प्रदर्शित करता है का उपयोग करते हुए):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; // Note: add reference required: System.Design.dll 

namespace WindowsFormsApplication1 { 
    [Designer(typeof(MyDesigner))] // Note: custom designer 
    public partial class UserControl1 : UserControl { 
     public UserControl1() { 
      InitializeComponent(); 
     } 

     // Note: property added 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
     public ListView Employees { get { return listView1; } } 
    } 

    // Note: custom designer class added 
    class MyDesigner : ControlDesigner { 
     public override void Initialize(IComponent comp) { 
      base.Initialize(comp); 
      var uc = (UserControl1)comp; 
      EnableDesignMode(uc.Employees, "Employees"); 
     } 
    } 
} 

उपयोगकर्ता नियंत्रण में सूची दृश्य अब क्लिक किया और सामान्य रूप में डिजाइन किया जा सकता है।

+6

++ दयालु होने के लिए धन्यवाद। खुशी है कि तुमने मुझे कुछ सिखाया और सिखाया। –

+4

यह एक सही उत्तर का सही उदाहरण था =) Thx! – Ted

संबंधित मुद्दे