2010-05-03 11 views
5

[संपादित करें] स्पष्ट है कि, मुझे पता है कि प्रतिबिंब के माध्यम से रूपों की एक सूची प्राप्त करने के। मैं डिजाइन समय संपत्ति ग्रिड से अधिक चिंतित हूं।दृश्य स्टूडियो डिजाइन समय संपत्ति - पर्चा सूची ड्रॉप डाउन

मैं प्रकार फार्म की एक सार्वजनिक संपत्ति के साथ एक उपयोगकर्ता नियंत्रण है।
मैं एक ड्रॉप-डाउन से डिजाइन समय में एक विधि चुनने के लिए सक्षम होना चाहते हैं।
मैं एक सेट नेमस्पेस से फॉर्म ड्रॉपडाउन सूची को पॉप्युलेट करना चाहता हूं: UI.Foo.Forms

यह काम करेगा जैसे कि आपके पास नियंत्रण की सार्वजनिक संपत्ति है। डिजाइन समय, संपत्ति स्वचालित रूप से सभी नियंत्रण के साथ एक लटकती फार्म पर, आप में से चयन करने के लिए बस जाएँगे। मैं सिर्फ नामस्थान में सभी रूपों के साथ इसे पॉप्युलेट करना चाहता हूं।

कैसे मैं यह कर के बारे में जाते हैं? मुझे उम्मीद है कि मैं काफी स्पष्ट हूं इसलिए कोई भ्रम नहीं है। यदि संभव हो तो मैं कुछ कोड उदाहरणों की तलाश में हूं। मैं इस पर बहुत अधिक समय बिताने से बचने की कोशिश कर रहा हूं जब मेरे पास मिलने के लिए अन्य समय सीमाएं होंगी।

अग्रिम में आपकी सहायता के लिए धन्यवाद।

उत्तर

7

आप आसानी से प्रतिबिंब के माध्यम से कक्षाएं प्राप्त कर सकते हैं:

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name); 

मान लिया जाये कि आप अपने रूपों के रूप में ही विधानसभा में कोड से कॉल कर रहे हैं, तो आप सभी प्रकार के ऐसे नाम हैं जो कर रहे हैं मिल जाएगा "UI.Foo.Forms" नामस्थान। इसके बाद आप लटकती में यह पेश कर सकते हैं और अंततः, दृष्टांत जो भी प्रतिबिंब के माध्यम से उपयोगकर्ता द्वारा चुना जाता है एक बार फिर:

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName")); 

[संपादित करें] डिजाइन समय सामान के लिए कोड जोड़ना:

अपने नियंत्रण पर आप जैसे एक प्रपत्र संपत्ति बना सकते हैं:

[Browsable(true)] 
[Editor(typeof(TestDesignProperty), typeof(UITypeEditor))] 
[DefaultValue(null)] 
public Type FormType { get; set; } 

का संदर्भ कौन सा संपादक प्रकार है कि परिभाषित किया जाना चाहिए। कोड सुंदर आत्म व्याख्यात्मक है, फेरबदल का एक न्यूनतम राशि के साथ, आप की संभावना यह निर्माण करने के लिए आप क्या चाहते प्राप्त करने में सक्षम हो जाएगा।

public class TestDesignProperty : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.DropDown; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 

     ListBox lb = new ListBox(); 
     foreach(var type in this.GetType().Assembly.GetTypes()) 
     { 
      lb.Items.Add(type); 
     } 

     if (value != null) 
     { 
      lb.SelectedItem = value; 
     } 

     edSvc.DropDownControl(lb); 

     value = (Type)lb.SelectedItem; 

     return value; 
    } 
} 
+0

मैं थोड़े से जानता था कि फॉर्मों की सूची कैसे प्राप्त करें, लेकिन मुझे नहीं पता कि कैसे मेरी सार्वजनिक संपत्ति के लिए डिज़ाइन व्यू में डिज़ाइन समय पर प्रॉपर्टी ग्रिड में इन आबादी को प्राप्त किया जाए। –

+0

ने डिज़ाइन-टाइम आवश्यकताओं को पूरा करने के लिए मेरा उत्तर अपडेट किया। – CMerat

+1

धन्यवाद मेरेट, मुझे स्वीकार करने के लिए 14 घंटे इंतजार करना है (टर्की शिकार करना, इसलिए यह कुछ दिन हो सकता है :), लेकिन पूरी तरह से काम किया। –

2

जब आइटम पर क्लिक करके इसे चुन लिया जाता है लटकती बंद नहीं होती है, तो यह उपयोगी हो सकता है:

लिस्टबॉक्स के लिए क्लिक करें ईवेंट हैंडलर निर्दिष्ट करेंगे और ईवेंट हैंडलर समारोह जोड़ने

public class TestDesignProperty : UITypeEditor 
{ 

    // ... 

    IWindowsFormsEditorService editorService; 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
     { 
      // ... 
      editorService = edSvc ; // so can be referenced in the click event handler 

      ListBox lb = new ListBox(); 
      lb.Click += new EventHandler(lb_Click); 
      // ... 
     } 



    void lb_Click(object sender, EventArgs e) 
    { 
     editorService.CloseDropDown(); 
    } 

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