Properties zu einer Gruppe zusammenfassen

  • Allgemein

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von us4711.

    Properties zu einer Gruppe zusammenfassen

    Hallo liebe Community!
    Ich komme gleich zum Punkt, wie ist es mir möglich, Properties (bei einem Control) zu einer Gruppe zusammenfassen, sodass ich z.B. ColerScheme habe, dies mit dem kleinen Plus öffnen kann, und ich darunter dann die Verschiedenen Unter-Farben finde?

    Ich habe ebenfalls schon ein bisschen gegooglet und Probiert. Unter anderem bin auch <Category("ColorScheme")> gestoßen. Dies hat mir leider nicht weitergeholfen.


    Bitte um Hilfe.
    Danke im Vorraus.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Hi
    schau' dir mal System.ComponentModel.TypeConverter an. Das definiert eine GetProperties- und GetPropertiesSupported-Funktion. Die zurückgegebenen PropertyDescriptor-Instanzen stellen halt Properties dar, die entweder auf dem Objekt existieren oder manuell gesetzt werden. Der TypeConverter wird für den Typ durch ein TypeConverterAttribute angegeben.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    @~blaze~
    Getan...oder eher Versucht, jedoch weiß ich nicht wie ich das jetzt anwenden soll...

    Edit:// Moment ich glaube ich habs gleich...
    Edit:// Doch nicht...
    Ich habe herausgefunden dass es mit <TypeConverter(GetType(ExpandableObjectConverter))> _ funktionieren soll. Jedoch habe ich keine Ahnung wie ich dies Sinnvoll anwenden kann.
    Nurnochmal als kleine Information,
    Ich will bei meinem Control die Color-Properties übersichtlicher gestallten und die alle in einen kleinen Expander (o. eine Gruppe) mit dem Namen ColorScheme packen. (z.B. wie bei der Size property)

    Edit:// Danke für den Denkanstoß ich habs gelöst.
    Mit:

    VB.NET-Quellcode

    1. <TypeConverter(GetType(ExpandableObjectConverter))> _
    2. Public Property TestColor As New ColorScheme

    Die Classe ColorScheme wurde ebenfalls von mir erstellt und beinhaltet die Properties.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Gather“ ()

    Um's noch mal zu zeigen:

    VB.NET-Quellcode

    1. Public Class UserControl
    2. Inherits Control
    3. Public Property ColorScheme As ColorScheme
    4. End Class
    5. <System.ComponentModel.TypeConverter(GetType(ColorSchemeConverter))> _
    6. Public Structure ColorScheme
    7. Public Property BorderColor As Color
    8. Public Property ShapeContentColor As Color
    9. End Structure
    10. Public Class ColorSchemeConverter
    11. Inherits System.ComponentModel.TypeConverter
    12. Public Overrides Function GetProperties(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal value As Object, ByVal attributes() As System.Attribute) As System.ComponentModel.PropertyDescriptorCollection
    13. Return context.PropertyDescriptor.GetChildProperties(value, attributes)
    14. End Function
    15. Public Overrides Function GetPropertiesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
    16. Return True
    17. End Function
    18. Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
    19. Return GetType(String).IsAssignableFrom(destinationType)
    20. End Function
    21. Public Overrides Function IsValid(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal value As Object) As Boolean
    22. Return value IsNot Nothing AndAlso CanConvertTo(value.GetType())
    23. End Function
    24. Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
    25. If GetType(String).IsAssignableFrom(destinationType) Then
    26. Dim scheme As ColorScheme = CType(value, ColorScheme) 'ggf. konvertieren
    27. Return String.Format("BorderColor = {0}, ShapeContentColor = {1}", scheme.BorderColor, scheme.ShapeContentColor)
    28. Else
    29. Throw New ArgumentException("Cannot convert to the specified type.")
    30. End If
    31. End Function
    32. End Class

    Der Converter bietet durch context.PropertyDescriptor.GetChildProperties(value, attributes) einfach alle von der Parent-Property bereitgestellten Properties an.

    Gruß
    ~blaze~
    Zu beachten ist in jedem Falle die Designer-Seralisierung. Bei komplexeren Typen, z.B. List(of T) etc. müssen dann mit den Attributen noch weitere DEkorationen vorgenommen werden.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class MyUsercontrol
    3. Inherits UserControl
    4. Public Sub New()
    5. MyBase.new()
    6. Me.MyPropertyToExpand = New PropertiesToExpand
    7. End Sub
    8. <DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content)>
    9. Property MyPropertyToExpand As PropertiesToExpand
    10. End Class
    11. '<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))>
    12. <System.ComponentModel.TypeConverter(GetType(MyTypeConverter))>
    13. Public Class PropertiesToExpand
    14. Public Sub New()
    15. MyBase.new()
    16. End Sub
    17. Property WertType1 As Integer = -1
    18. Property WertType2 As String = String.Empty
    19. Property ReferenzType1 As Color = Color.Green
    20. Property ReferenzType2 As Padding = New Padding(5, 4, 3, 2)
    21. End Class
    22. Public Class MyTypeConverter ' Vorschlag von ~blaze~
    23. Inherits System.ComponentModel.ExpandableObjectConverter
    24. Public Overrides Function GetProperties(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal value As Object, ByVal attributes() As System.Attribute) As System.ComponentModel.PropertyDescriptorCollection
    25. Return context.PropertyDescriptor.GetChildProperties(value, attributes)
    26. End Function
    27. Public Overrides Function GetPropertiesSupported(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Boolean
    28. Return True
    29. End Function
    30. Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
    31. Return GetType(String).IsAssignableFrom(destinationType)
    32. End Function
    33. Public Overrides Function IsValid(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal value As Object) As Boolean
    34. Return value IsNot Nothing AndAlso CanConvertTo(value.GetType())
    35. End Function
    36. Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
    37. If GetType(String).IsAssignableFrom(destinationType) Then
    38. Dim MyClassToDecorate As PropertiesToExpand = CType(value, PropertiesToExpand) 'ggf. konvertieren
    39. Return "Properties können expandiert werden ..."
    40. Else
    41. Throw New ArgumentException("Cannot convert to the specified type.")
    42. End If
    43. End Function
    44. End Class
    also ich wüsste nicht, warum man hier einen eigenen TypConverter schreiben sollte, weil der ExpandableObjectConverter ist doch gut - oder ist ers nicht?

    Höchstens noch anzumerken, dass man auch gleich die ColorScheme-Klasse damit attributieren kann, was die Expandablität dann grundsätzlich mittm ColorScheme verknüpft, und dann braucht man nicht merh die einzelne Property damit auszuzeichnen.
    Ist egal, wenn die Klasse nur an einer Stelle verwendet wird, aber bei an mehreren Stellen wirkt sich das schon aus.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. <DesignerCategory("Code")> _
    3. Public Class MyControl : Inherits Control
    4. Public Property Scheme As ColorScheme
    5. Public Property Scheme2 As ColorScheme
    6. End Class
    7. <System.ComponentModel.TypeConverter(GetType(ExpandableObjectConverter))> _
    8. Public Structure ColorScheme
    9. Public Property BorderColor As Color
    10. Public Property ShapeContentColor As Color
    11. End Structure
    Solang's immer so ist ists unnötig, einen neuen Converter einzuführen. Ich bin aber davon ausgegangen, dass man auch eine eigene String-Konvertierung mit einbaut. Globales deklarieren ist auch ok. Hab' die Structure erst danach noch hinzuprogrammiert, nachdem ich gemerkt hab', dass ich die Überladung vom Convert* nicht auswendig wusste...

    Gruß
    ~blaze~

    ErfinderDesRades schrieb:

    also ich wüsste nicht, warum man hier einen eigenen TypConverter schreiben sollte, weil der ExpandableObjectConverter ist doch gut - oder ist ers nicht?


    Nur eine Sache der Optik. Damit kann man im Property-Grid komplexe Situationen im Expandable ergonomsicher darstellen. Ansonsten reicht natürlich ein einfaches Überschreiben der ToString - Methode aus.