CollectionEditor, der für System.Drawing.Point "Objekt stimmt nicht mit dem Zieltyp überein."

8

Ich habe ein benutzerdefiniertes Steuerelement mit einer Eigenschaft vom Typ Collection<System.Drawing.Point> . Wenn ich CollectionEditor zum Bearbeiten dieser Eigenschaft verwende, zeigt das Fenster CollectionEditor "Object does not match target type." für die Eigenschaften "X" und "Y" . Aber wenn ich stattdessen System.Drawing.PointF verwende, gibt es keinen Fehler.

Kann jemand bitte erklären, warum dieser Unterschied auftritt?

    
smwikipedia 08.04.2010, 05:19
quelle

3 Antworten

3

Der Unterschied zwischen Point und PointF liegt tatsächlich bei PointConverter. Warum dies ein Problem verursacht, ist eine ziemlich lange Geschichte, aber am Ende des Tages läuft es auf Folgendes hinaus:

Die System.ComponentModel.ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor) Implementierung in System.ComponentModel.Design.CollectionEditor .CollectionEditorCollectionForm.SelectionWrapper gibt einfach this zurück.

Laut der MSDN-Seite der oben genannten Methode der ICustomTypeDescriptor -Schnittstelle sollte eine Implementierung

sein
  

Gibt ein Objekt zurück, das die durch den angegebenen Eigenschaftsdeskriptor beschriebene Eigenschaft enthält.

Wenn ich es richtig verstehe, widerspricht die Implementierung in diesem Fall der Dokumentation.

Dies beruht auf einigen eigenen Untersuchungen, also halte es nicht für selbstverständlich. Ich habe einen Bericht über dieses Problem bei Microsoft Connect veröffentlicht, also werden wir hoffentlich in ein paar Tagen davon erfahren. Ich melde mich zurück, wenn eine Antwort eingegangen ist.

    
kicsit 19.04.2010, 10:42
quelle
2

Ich bin kein .NET / C # -Experte, aber das Problem scheint irgendwo in der Klasse PointConverter zu liegen, die als TypeConverterAttribute für die Klasse System.Drawing.Point verwendet wird. Der Auflistungs-Editor muss etwas in der PointConverter -Klasse verwenden, das fehlschlägt.

Ich vermute PointConverter , weil die Klasse PointF keine TypeConverterAttribute hat, und es funktioniert gut.

Im folgenden Beispiel, das ich mithilfe von Code aus MSDN zusammengeschustert habe, ist Ihr Problem aufgetreten Wird angezeigt, wenn die Klasse Point in einer Auflistung verwendet wird, aber nicht mit der Klasse MyPoint , die eine benutzerdefinierte TypeConverter verwendet.

%Vor%     
WildCrustacean 16.04.2010 21:31
quelle
0

Meine Lösung ist, bevor Sie collectioneditor verwenden, um die Liste (des Punktes) zu bearbeiten. Verwenden Sie TypeDescriptor.AddAttributes(GetType(Drawing.Point), New TypeConverterAttribute()) , um typeconverter von Point auf nothing zu setzen, und verwenden Sie anschließend TypeDescriptor.AddAttributes(GetType(Drawing.Point), New TypeConverterAttribute(GetType(PointConverter))) , um typeconverter auf default zu setzen.

    
Zhang 23.06.2017 14:54
quelle

Tags und Links