8

जारी नहीं है मैं विजुअल स्टूडियो के लिए एक एक्सटेंशन विकसित कर रहा हूं।डायलॉगपेज - स्ट्रिंग सरणी

वहाँ मैं एक विकल्प पृष्ठ है:

public class GeneralOptionsPage : DialogPage 
{ 
    [Category("General")] 
    [DisplayName("Foos")] 
    [Description("Bla Foo Bla")] 
    public string[] Foos { get; set; } 


    [Category("General")] 
    [DisplayName("Bar")] 
    [Description("Bar Foo Bar")] 
    public string Bar { get; set; } 
} 

Bar संपत्ति पूरी तरह से काम करता है और एक समान होती है।

Foos संपत्ति भी काम करती है (यह आपको विकल्प पृष्ठ में एक अच्छा पॉपअप भी देती है जहां आप प्रति पंक्ति एक स्ट्रिंग दर्ज कर सकते हैं), जिसका अर्थ है कि मैं इसे सेट कर सकता हूं और इसे अपने एक्सटेंशन में भी उपयोग कर सकता हूं लेकिन यह लिखा नहीं है रजिस्ट्री/भंडारण के लिए। जब मैं वीएस बंद करता हूं और इसे फिर से खोलता हूं तो यह हमेशा खाली रहता है।

MSDN से

उद्धरण:

DialogPage के डिफ़ॉल्ट कार्यान्वयन गुण उचित कन्वर्टर्स है या कि संरचना या सरणियों कि गुण उचित कन्वर्टर्स है कि में विस्तार किया जा सकता है कि समर्थन करता है। कन्वर्टर्स की एक सूची के लिए, System.ComponentModel नामस्थान देखें। विजुअल स्टूडियो एक्सटेंसिबिलिटी नमूने int, स्ट्रिंग और सिस्टम का प्रबंधन करते हैं। ड्रॉइंग .इज गुण।

मेरी समझ में मैं System.ComponentModel नामस्थान से वैध घटकों का उपयोग कर रहा हूं।

तो मैं गलत क्या कर रहा हूं? क्या मुझे किसी भी तरह से सरणी का इलाज करना है?

+0

आप एक सूची बजाय स्ट्रिंग [] की कोशिश की है? –

+0

जब आप 'सूची ' का उपयोग करते हैं, तो आपको एक कक्षा प्रदान करना होगा जिसमें एक खाली कन्स्ट्रक्टर है, जो 'स्ट्रिंग' नहीं है। लेकिन मैंने 'सूची ' का उपयोग करने का भी प्रयास किया, जहां 'MyCustomClass'' स्ट्रिंग 'के लिए एक रैपरक्लास है- लेकिन मानों को स्थिर नहीं किया जाएगा। –

+0

क्या आपने ['स्ट्रिंगकोलेक्शन'] (http://msdn.microsoft.com/en-us/library/system.collections.specialized.stringcollection.aspx) को आजमाया था? – qqbenq

उत्तर

6

आपको अपने Foos प्रॉपर्टी के लिए कस्टम टाइप कनवर्टर को कार्यान्वित करने और संबद्ध करने की आवश्यकता होगी।

कोई स्टॉक कनवर्टर नहीं है जो इस परिदृश्य को कवर करता है, क्योंकि जब आप तारों की एक सरणी को स्ट्रिंग में परिवर्तित कर रहे हैं, तो आपको कुछ प्रकार का डिलीमीटर होना चाहिए, ताकि आप स्ट्रिंग से सरणी का पुनर्गठन कर सकें। और यह अलग-अलग प्रोग्रामर एप्लिकेशन के आधार पर अलग-अलग होगा। इसलिए कस्टम टाइप कनवर्टर की आवश्यकता है।

तो आपको System.ComponentModel.TypeConverter से एक नई कक्षा प्राप्त करनी है, और फिर इसे अपने Foos प्रॉपर्टी से संबद्ध करें। उदाहरण के लिए:

[Category("General")] 
    [DisplayName("Foos")] 
    [Description("Bla Foo Bla")] 
    [TypeConverter(typeof(FoosCoverter))] 
    public string[] Foos { get; set; } 

एक त्वरित इंटरनेट खोज आपको सही दिशा में इंगित करने के लिए कुछ उदाहरण खींच लेनी चाहिए।

DialogPage.SaveSettingsToStorage पेज के PropertyDescriptors का एक संग्रह के माध्यम से लूप होता है, प्रत्येक propertie के कनवर्टर प्राप्त करता है, CanConvertTo और CanConvertFrom invokes सुनिश्चित करने के लिए संपत्ति एक स्ट्रिंग से/परिवर्तित किया जा सकता है, तो करने के लिए संपत्ति लागू करने के लिए कनवर्टर के ConvertToInvariantString कॉल रजिस्ट्री मूल्य।

इसके विपरीत, DialogPage.LoadSettingsfromStorage रजिस्ट्री मान के माध्यम से लूप होता है, DialogPage पर संपत्ति मिलान PropertyDescriptor पाता है, इसकी coverter प्राप्त करता है, तो यह सुनिश्चित करने के स्ट्रिंग कि विशेष रूप से संपत्ति प्रकार पर वापस परिवर्तित किया जा सकता CanCovertFrom कहता है, और फिर कॉल कनवर्टर का कनवर्टफ्रॉमइरिएंटस्ट्रिंग, और उसके बाद मूल्य को वापस संपत्ति को असाइन करता है।

+0

धन्यवाद। मैंने अपना स्वयं का कनवर्टर लिखा और यह काम करता है (मेरा जवाब देखें)। –

5

एड डोर ने सही उत्तर (धन्यवाद) साबित किया।

एक उदाहरण यहाँ अपने कस्टम TypeConverter के रूप में:

class StringArrayConverter : TypeConverter 
{ 
    private const string delimiter = "#@#"; 

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); 
    } 

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     return destinationType == typeof(string[]) || base.CanConvertTo(context, destinationType); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) 
    { 
     string v = value as string; 

     return v == null ? base.ConvertFrom(context,culture,value) : v.Split(new[] {delimiter}, StringSplitOptions.RemoveEmptyEntries); 
    } 

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     string[] v = value as string[]; 
     if (destinationType != typeof(string) || v == null) 
     { 
      return base.ConvertTo(context, culture, value,destinationType); 
     } 
     return string.Join(delimiter, v); 
    } 
} 
+1

यह समाधान मेरे लिए काम नहीं करता है। मैं सटीक में चलाता हूं इस थ्रेड में वर्णित वही समस्याएं http://stackoverflow.com/questions/32751040/store-array-in-options-using-dialogpage – Wumpf

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