2010-04-08 15 views
8

मेरे पास एक कस्टम नियंत्रण है जिसमें Collection<System.Drawing.Point> प्रकार की संपत्ति है। जब मैं इस संपत्ति को संपादित करने के लिए CollectionEditor का उपयोग करता हूं, CollectionEditor विंडो "X" और "Y" गुणों के लिए दिखाती है। लेकिन अगर मैं इसके बजाय System.Drawing.PointF का उपयोग करता हूं, तो कोई विफलता नहीं है।संग्रह एडिटर उपज "ऑब्जेक्ट लक्ष्य प्रकार से मेल नहीं खाता है।" System.Drawing.Point

क्या कोई यह बता सकता है कि यह अंतर क्यों होता है?

उत्तर

3

प्वाइंट और प्वाइंटएफ के बीच का अंतर वास्तव में प्वाइंट कनवर्टर के साथ है। यह समस्या का कारण बनता है, यह काफी लंबी कहानी है, लेकिन दिन के अंत में यह निम्न तक उबाल जाता है:

System.ComponentModel.ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor)System.ComponentModel.Design.CollectionEditor .CollectionEditorCollectionForm.SelectionWrapper में कार्यान्वयन this पर आता है।

ICustomTypeDescriptor इंटरफेस के ऊपर उल्लिखित विधि का MSDN पृष्ठ के अनुसार, एक कार्यान्वयन करना चाहिए

वापसी (रों) एक वस्तु है कि संपत्ति निर्दिष्ट संपत्ति वर्णनकर्ता द्वारा वर्णित हैं।

यदि मैं इसे सही ढंग से समझता हूं, तो इस मामले में कार्यान्वयन दस्तावेज़ों के विपरीत है।

यह मेरे अपने शोध पर आधारित है, इसलिए इसे मंजूर न करें। मैंने माइक्रोसॉफ्ट कनेक्ट पर इस मुद्दे की एक रिपोर्ट पोस्ट की है, इसलिए उम्मीद है कि हम कुछ दिनों में निश्चित रूप से जान लेंगे। जब उत्तर प्राप्त होता है तो मैं वापस रिपोर्ट करूंगा।

2

मैं कोई .NET/C# विशेषज्ञ नहीं हूं, लेकिन यह समस्या PointConverter कक्षा के भीतर कहीं दिखाई देती है, जिसे System.Drawing.Point कक्षा के लिए TypeConverterAttribute के रूप में उपयोग किया जाता है। संग्रह संपादक को PointConverter कक्षा में कुछ ऐसा उपयोग करना चाहिए जो विफल रहता है।

मुझे PointConverter पर संदेह है क्योंकि PointF कक्षा में TypeConverterAttribute नहीं है, और यह ठीक काम करता है।

निम्न उदाहरण में, जो मैं एक साथ पत्थर MSDN से कुछ कोड का उपयोग कर, आपकी समस्या को जब एक संग्रह में Point वर्ग का उपयोग कर देखा जाता है, लेकिन MyPoint वर्ग जो एक कस्टम TypeConverter उपयोग कर रहा है के साथ नहीं।

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Text; 
using System.Windows.Forms; 
using System.Globalization; 

namespace WindowsControlLibrary1 
{ 
    public class MyTypeConverter : TypeConverter 
    { 
     // Overrides the CanConvertFrom method of TypeConverter. 
     // The ITypeDescriptorContext interface provides the context for the 
     // conversion. Typically, this interface is used at design time to 
     // provide information about the design-time container. 
     public override bool CanConvertFrom(ITypeDescriptorContext context, 
      Type sourceType) 
     { 

      if (sourceType == typeof(string)) 
      { 
       return true; 
      } 
      return base.CanConvertFrom(context, sourceType); 
     } 
     // Overrides the ConvertFrom method of TypeConverter. 
     public override object ConvertFrom(ITypeDescriptorContext context, 
      CultureInfo culture, object value) 
     { 
      if (value is string) 
      { 
       string[] v = ((string)value).Split(new char[] { ',' }); 
       return new MyPoint(int.Parse(v[0]), int.Parse(v[1])); 
      } 
      return base.ConvertFrom(context, culture, value); 
     } 
     // Overrides the ConvertTo method of TypeConverter. 
     public override object ConvertTo(ITypeDescriptorContext context, 
      CultureInfo culture, object value, Type destinationType) 
     { 
      if (destinationType == typeof(string)) 
      { 
       return ((MyPoint)value).X + "," + ((MyPoint)value).Y; 
      } 
      return base.ConvertTo(context, culture, value, destinationType); 
     } 
    } 

    [SerializableAttribute] 
    [TypeConverterAttribute(typeof(MyTypeConverter))] 
    public struct MyPoint 
    { 
     private int x; 
     private int y; 

     public MyPoint(int _x, int _y) 
     { 
      x = _x; 
      y = _y; 
     } 

     public int X 
     { 
      get { return x; } 
      set { x = value; } 
     } 
     public int Y 
     { 
      get { return y; } 
      set { y = value; } 
     } 

    } 

    public partial class UserControl1 : UserControl 
    { 
     private List<System.Drawing.Point> points; 
     private List<System.Drawing.PointF> pointfs; 
     private List<MyPoint> mypoints; 


     public List<System.Drawing.Point> PointList 
     { 
      get{ return points;} 
      set{ points = value;} 
     } 

     public List<System.Drawing.PointF> PointFList 
     { 
      get {return pointfs;} 
      set{pointfs = value;} 
     } 

     public List<MyPoint> MyPointList 
     { 
      get { return mypoints; } 
      set { mypoints = value; } 
     } 

     public UserControl1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+0

धन्यवाद बीडीई। मुझे लगता है कि अगर मैं TypeConverter.GetCreateInstanceSupported() को सही करता हूं। यह अच्छी तरह से काम नहीं करेगा – smwikipedia

+0

GetCreateInstance() वास्तव में वापस लौटने का मतलब है कि आपका प्रकार अपरिवर्तनीय है (या कम से कम आपकी गुणों में से केवल एक ही पढ़ा जाता है), यानी, यदि आप किसी संपत्ति को संशोधित करना चाहते हैं तो एक नया उदाहरण बनाया जाना चाहिए। दुर्भाग्यवश इसका मतलब है कि इसे हमेशा टाला नहीं जा सकता है। – kicsit

0

मेरे समाधान इससे पहले कि आप collectioneditor का उपयोग करें (बिंदु के) सूची को संपादित करने, TypeDescriptor.AddAttributes(GetType(Drawing.Point), New TypeConverterAttribute()) का उपयोग कुछ भी नहीं करने के लिए प्वाइंट के typeconverter स्थापित करने के लिए, और कहा कि उपयोग TypeDescriptor.AddAttributes(GetType(Drawing.Point), New TypeConverterAttribute(GetType(PointConverter))) के बाद डिफ़ॉल्ट typeconverter स्थापित करने के लिए है।

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