2008-11-24 9 views
22

आप रनटाइम पर किसी भी तरह से प्रॉपर्टीग्रिड को कैसे संशोधित करते हैं? मैं गुणों को जोड़ने और हटाने और "गतिशील प्रकार" जोड़ने में सक्षम होना चाहता हूं, जिसका अर्थ है कि इसका एक प्रकार है जिसके परिणामस्वरूप टाइपकॉन्टर का उपयोग करके प्रॉपर्टीग्रिड में रनटाइम उत्पन्न ड्रॉपडाउन होता है।रनटाइम पर PropertyGrid को संशोधित करने के लिए (संपत्ति/गतिशील प्रकार/enums जोड़ें/हटाएं)

मैं वास्तव में उन दोनों चीजों को करने में सक्षम हूं (गुण जोड़ें/हटाएं और गतिशील प्रकार जोड़ें) लेकिन केवल एक ही समय में अलग नहीं है।

रनटाइम पर गुण जोड़ने और निकालने के लिए समर्थन को लागू करने के लिए मैंने this codeproject article का उपयोग किया और विभिन्न प्रकारों (केवल स्ट्रिंग्स नहीं) का समर्थन करने के लिए कोड को थोड़ा सा संशोधित किया।

private System.Windows.Forms.PropertyGrid propertyGrid1; 
private CustomClass myProperties = new CustomClass(); 

public Form1() 
{ 
    InitializeComponent(); 

    myProperties.Add(new CustomProperty("Name", "Sven", typeof(string), false, true)); 
    myProperties.Add(new CustomProperty("MyBool", "True", typeof(bool), false, true)); 
    myProperties.Add(new CustomProperty("CaptionPosition", "Top", typeof(CaptionPosition), false, true)); 
    myProperties.Add(new CustomProperty("Custom", "", typeof(StatesList), false, true)); //<-- doesn't work 
} 

/// <summary> 
/// CustomClass (Which is binding to property grid) 
/// </summary> 
public class CustomClass: CollectionBase,ICustomTypeDescriptor 
{ 
    /// <summary> 
    /// Add CustomProperty to Collectionbase List 
    /// </summary> 
    /// <param name="Value"></param> 
    public void Add(CustomProperty Value) 
    { 
     base.List.Add(Value); 
    } 

    /// <summary> 
    /// Remove item from List 
    /// </summary> 
    /// <param name="Name"></param> 
    public void Remove(string Name) 
    { 
     foreach(CustomProperty prop in base.List) 
     { 
      if(prop.Name == Name) 
      { 
       base.List.Remove(prop); 
       return; 
      } 
     } 
    } 

आदि ...

public enum CaptionPosition 
{ 
    Top, 
    Left 
} 

मेरे पूर्ण समाधान here डाउनलोड किया जा सकता।

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

public class StatesList : System.ComponentModel.StringConverter 
{ 
    private string[] _States = { "Alabama", "Alaska", "Arizona", "Arkansas" }; 

    public override System.ComponentModel.TypeConverter.StandardValuesCollection 
    GetStandardValues(ITypeDescriptorContext context) 
    { 
     return new StandardValuesCollection(_States); 
    } 

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
    { 
     return true; 
    } 

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
    { 
     return true; 
    } 
} 

एक TypeConverter का उपयोग करने का विधि ठीक काम करता है जब आप संपत्ति रनटाइम पर बिना किसी समस्या के उदाहरण के लिए this code काम करता है जोड़ने के लिए, कोशिश नहीं है, लेकिन मैं दोनों ऐसा करने में सक्षम होना चाहता हूँ।

कृपया my project पर एक नज़र डालें। धन्यवाद!

उत्तर

7

आप क्या करते हैं, एक संपत्ति के रूप में स्टेट्सलिस्ट (एक टाइप कनवर्टर) जोड़ रहा है।
आपको क्या करना चाहिए, राज्य सूची के साथ अपनी टाइपकॉन्टर के रूप में एक संपत्ति जोड़ रहा है।

5

आह, ज़ाहिर है!

myProperties.Add(new CustomProperty("Custom", "", typeof(States), false, true)); 

[TypeConverter(typeof(StatesList))] 
public class States 
{ 
} 

एक आकर्षण की तरह काम करता है, धन्यवाद!

मैंने अपनी परियोजना को अपडेट किया है, उम्मीद है कि यह दूसरों के लिए सहायक हो सकता है, यह here पाया जा सकता है।

+0

आप कर रहे हैं स्वागत :) –

+0

मैं जानता हूँ कि पद बहुत पुराना है, लेकिन मैं एक छोटा सवाल है। मैं वास्तव में अपने आवेदन के भीतर आपका कोड उपयोगकर्ता लेकिन कस्टम combobox काम नहीं करता है। संपत्ति का नाम गहरा हुआ है और कोई विकल्प उपलब्ध नहीं है। कोई विचार, मैं इसे ठीक करने के लिए क्या कर सकता हूं? अग्रिम धन्यवाद, मार्टिन – user653427

+1

@ user653427, के बाद से इस तरह के एक पुराने सवाल है, यह भी है कि यह एक नया प्रश्न पोस्ट और इस पृष्ठ पर यह लिंक करने के लायक हो सकता है। आप अधिक जानकारी देने और इस तरह से अधिक लोगों तक पहुंचने में सक्षम होंगे। –

3

यह प्रश्न और उत्तर मेरे लिए बहुत उपयोगी था। हालांकि, मुझे रन-टाइम जेनरेटेड ड्रॉपडाउन सूची मानों की अनुमति देकर चीजों को थोड़ा आगे बढ़ाने की आवश्यकता थी। मैंने सोचा कि अगर कोई इसे उपयोगी पाता है, तो मुझे इसके लिए कुछ नमूना कोड पोस्ट करना होगा।

पहले, मैं CustomProperty निर्माता के लिए एक विकल्प पैरामीटर जोड़ा और एक विकल्प संपत्ति कहा:

private List<string> lOptions; 

    public CustomProperty(string sName, object value, Type tType, bool bReadOnly, bool bVisible, List<string> lOptions) 
    { 
     this.lOptions = lOptions; 
    } 

    public List<string> Options 
    { 
     get { return lOptions; } 
    } 

दूसरा, मैं CustomPropertyDescriptor वर्ग के लिए एक विकल्प संपत्ति कहा:

public List<string> Options 
    { 
     get 
     { 
      return m_Property.Options; 
     } 
    } 

तीसरा, मैं मेरे गतिशील प्रकार वर्ग (यानी) में GetStandardValues ​​विधि को संशोधित करना थाStatesList) CustomPropertyDescriptor वस्तु पर नया विकल्प संपत्ति का उपयोग करने के:

public override StandardValuesCollection 
       GetStandardValues(ITypeDescriptorContext context) 
    { 
     CustomPropertyDescriptor descriptor = (CustomPropertyDescriptor)context.PropertyDescriptor; 
     return new StandardValuesCollection(descriptor.Options); 
    } 

अंत में, मैं विकल्पों में से अपनी सूची में पारित करने के लिए किया था एक नया CustomProperty वस्तु बनाते समय:

List<string> optionsList = new List<string>(new string[] { "test1", "test2", "test3" });   
    CustomProperty myProperty = new CustomProperty(attr.Name, attr.Value, valueType, false, true, optionsList); 

के स्थान में इस उदाहरण के लिए मैंने जो स्थाई सूची पारित की है, आप अपने ड्रॉपडाउन के लिए विकल्पों की सूची जेनरेट कर सकते हैं, जिससे आप उपलब्ध विकल्पों पर पूर्ण नियंत्रण दे सकें।

+0

के लिए डिफ़ॉल्ट मान को परिभाषित करना उत्तर पर विस्तार करने के लिए समय निकालने के लिए धन्यवाद, बहुत उपयोगी है। –

+0

मूल्य टाइप क्या है? इसका टाइपोफ (सूची )? –

+0

यह संपत्ति मूल्य का प्रकार पारित किया जा रहा है, जो स्ट्रिंग, int, या राज्य जैसे कस्टम प्रकार जैसे कुछ हो सकता है (देखें @ salle55 का उत्तर)। आप टाइपफ का उपयोग कर सकते हैं, जैसे आपने संकेत दिया था या शायद कुछ मूल्य की तरह। GetType()। – Scott

0
मेरे मामले में

TypeConverter स्टेट्स वर्ग के लिए लागू नहीं किया था

[TypeConverter(typeof(StatesList))] // not work 
public class States 
{ 
} 

तो मैं CustomPropertyDescriptor में ओवरराइड जोड़ा

public override TypeConverter Converter 
{ 
    get { 
     if (this.PropertyType.Equals(typeof(States))) { 
      return new StatesList(); ; 
     } 
     return base.Converter; 
    } 
} 
संबंधित मुद्दे