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?
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
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.
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.
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.
Tags und Links c# collectioneditor