2009-06-19 6 views
26

मेरे पास एक सूची <> (मेरी कस्टम कक्षा) है। मैं PropertyGrid नियंत्रण पर एक बॉक्स में इस सूची में एक विशिष्ट आइटम प्रदर्शित करना चाहता हूं। बॉक्स के अंत में मैं [...] बटन चाहूंगा। क्लिक करने पर, यह एक फॉर्म खोल देगा जो, अन्य चीजों के साथ, उन्हें सूची में से किसी एक आइटम को चुनने की अनुमति देगा। बंद होने पर, चयनित मूल्य को दर्शाने के लिए PropertyGrid को अपडेट किया जाएगा।कस्टम प्रॉपर्टीग्रीड संपादक आइटम कैसे बनाएं, जो एक फॉर्म खोलता है?

किसी भी मदद की सराहना की।

using System.ComponentModel; 
using System.Drawing.Design; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
using System; 

class MyType 
{ 
    private Foo foo = new Foo(); 
    public Foo Foo { get { return foo; } } 
} 

[Editor(typeof(FooEditor), typeof(UITypeEditor))] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
class Foo 
{ 
    private string bar; 
    public string Bar 
    { 
     get { return bar; } 
     set { bar = value; } 
    } 
} 
class FooEditor : UITypeEditor 
{ 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.Modal; 
    } 
    public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value) 
    { 
     IWindowsFormsEditorService svc = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; 
     Foo foo = value as Foo; 
     if (svc != null && foo != null) 
     {    
      using (FooForm form = new FooForm()) 
      { 
       form.Value = foo.Bar; 
       if (svc.ShowDialog(form) == DialogResult.OK) 
       { 
        foo.Bar = form.Value; // update object 
       } 
      } 
     } 
     return value; // can also replace the wrapper object here 
    } 
} 
class FooForm : Form 
{ 
    private TextBox textbox; 
    private Button okButton; 
    public FooForm() { 
     textbox = new TextBox(); 
     Controls.Add(textbox); 
     okButton = new Button(); 
     okButton.Text = "OK"; 
     okButton.Dock = DockStyle.Bottom; 
     okButton.DialogResult = DialogResult.OK; 
     Controls.Add(okButton); 
    } 
    public string Value 
    { 
     get { return textbox.Text; } 
     set { textbox.Text = value; } 
    } 
} 
static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Form form = new Form(); 
     PropertyGrid grid = new PropertyGrid(); 
     grid.Dock = DockStyle.Fill; 
     form.Controls.Add(grid); 
     grid.SelectedObject = new MyType(); 
     Application.Run(form); 
    } 
} 

नोट:: यदि आप संपत्ति (मूल वस्तु आदि) के संदर्भ के बारे में कुछ का उपयोग करने की जरूरत है, वह यह है कि

उत्तर

60

आप, यह प्रदर्शित करने के लिए IWindowsFormsEditorService सेवा का उपयोग कर एक मॉडल UITypeEditor लागू करने की आवश्यकता ITypeDescriptorContext (EditValue में) प्रदान करता है; यह आपको PropertyDescriptor और Instance (MyType) बताता है।

+3

मेरी इच्छा है कि मैं इसे दो बार +1 कर सकता हूं! मैंने लगभग 2 साल पहले इसे उखाड़ फेंक दिया था और मैं एक ही परियोजना पर फिर से एक ही प्रश्न पर वापस आया और अभी भी यह वही पाया जो मुझे चाहिए था। महान जवाब, धन्यवाद! – Paccc

+0

सबकुछ अच्छा दिखता है, लेकिन FooEditor का कहीं भी उपयोग नहीं किया जाता है। इसे कुछ गुणों के लिए TypeEditor के रूप में सेट किया जाना चाहिए। – virious

+1

@virious टाइप-एडिटर्स को किसी संपत्ति या प्रकार के विरुद्ध निर्दिष्ट किया जा सकता है; इस मामले में यह लागू किया जाता है ('संपादक [टाइपोफ (FooEditor), टाइपोफ (UITypeEditor))]') के माध्यम से 'Foo'' के लिए। इस प्रकार *** '***' प्रकार की प्रत्येक *** प्रॉपर्टी डिफ़ॉल्ट रूप से इस संपादक का उपयोग करती है। उदाहरण में 'MyType.Foo' देखें। –

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