User Control Properties - Gruppen ansprechen/ entfernen, gruppieren

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    User Control Properties - Gruppen ansprechen/ entfernen, gruppieren

    Hallo,

    ich habe einige, für mich unlösbare, Fragen zu User-Controls.

    1. Ich habe das DataGridView "inherited" und möchte dessen Eigenschafts-Kathegorie "Daten" komplett entfernen.
    Einzelne Einträge konnte ich mit "Shadows" abändern, ganze Gruppen kann ich aber nicht ansprechen.
    Weiss jemand wie das geht und welches die beste Methode ist diese zu "löschen"?

    2. Wie kann ich Eigenschaften gruppieren (nicht Kathegorisieren/ "<Category>")?
    Bei vielen Controls ist z.B. "MaximumSize" aus "Width" und "Height" aufgebaut.

    Mein Versuch (Beispiel):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Property voller_name As New voller_name_class
    2. Public Class voller_name_class
    3. Public Property vorname As String
    4. Public Property nachname As String
    5. End Class

    Resultat: Siehe Shreenshot


    Ist aber auch nicht optimal für später, denn aus dieser Sub-Klasse kann ich nicht auf Objekte in der übergeordneten Klasse zugreifen, welche ich benötige.
    Bilder
    • Eigenschaftsfenster.png

      1,31 kB, 428×16, 226 mal angesehen

    ExpandableProperty

    Falls jemand auch Probleme damit hatt, zu Frage Nr. 2 konnte ich folgendes finden:
    "<TypeConverter(GetType(ExpandableObjectConverter))>"

    Mit diesem Attribut können Properties "Expandable" gemacht werden.

    Beispiel:

    VB.NET-Quellcode

    1. <TypeConverter(GetType(ExpandableObjectConverter))>
    2. Public Property VollerNameAs New VollerName_class
    3. Public Class VollerName_class
    4. Public Property Vorname As String = Nothing
    5. Public Property Nachname As String = Nothing
    6. End Class
    Mman kann die Anzeige der Properties durch einen eigenen ControlDesigner bestimmen/verändern, den man deklarativ per Attribute vor das entsprechende Control stellt.

    Etwas unsauberes Beispiel eines ControlDesigner, der alle bis auf wenige (vorausgestelltes -) Properties durch Überschreiben der Methode PreFilterProperties eines Controls ausblendet :
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MyControlDesigner
    2. Inherits System.Windows.Forms.Design.ControlDesigner
    3. Private Shared ReadOnly _unneededProperties As String() = { _
    4. "-Active", "-BackColor", "BackgroundImage", "BackgroundImageLayout", "-BorderStyle", "Font", "-FontTime", "*-FontLevel", "-FontMessage", _
    5. "-FormatStringDate", "-FormatStringLevel", "-FormatStringMessage", "-LogCapacity", "-FilterLevel", "-ShowLevel", "AccessibilityObject", _
    6. "AccessibleDefaultActionDescription", "AccessibleDescription", "AccessibleName", "AccessibleRole", "AllowDrop", "-Anchor", _
    7. "AutoSize", "AutoScrollOffset", "LayoutEngine", "BindingContext", "Bottom", "Bounds", "CanFocus", "CanSelect", "Capture", _
    8. "CausesValidation", "ClientRectangle", "ClientSize", "CompanyName", "ContainsFocus", "ContextMenu", "ContextMenuStrip", _
    9. "Controls", "Created", "Cursor", "DataBindings", "DisplayRectangle", "IsDisposed", "Disposing", "-Dock", "Enabled", "Focused", _
    10. "ForeColor", "Handle", "HasChildren", "-Height", "IsHandleCreated", "InvokeRequired", "IsAccessible", "IsMirrored", "Left", _
    11. "-Location", "-Margin", "MaximumSize", "MinimumSize", "-Name", "Parent", "ProductName", "ProductVersion", "RecreatingHandle", _
    12. "Region", "Right", "RightToLeft", "Site", "-Size", "TabIndex", "TabStop", "Tag", "Text", "Top", "TopLevelControl", "UseWaitCursor", _
    13. "-Visible", "-Width", "WindowTarget", "PreferredSize", "Padding", "ImeMode", "Container", "Modifiers", "GenerateMember", _
    14. "DefaultModifiers", "ApplicationSettings", "Name_158", "Locked"}
    15. ' just delete unneeded properties
    16. Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
    17. MyBase.PreFilterProperties(properties)
    18. For Each prop As String In _unneededProperties
    19. If properties.Contains(prop) Then
    20. properties.Remove(prop)
    21. End If
    22. Next
    23. ' TEST code to list all attribute strings
    24. 'Dim propertyString = ""
    25. 'Dim sr As New System.IO.StreamWriter("d:\properties.txt")
    26. '' TEST
    27. 'For Each obj As String In properties.Keys
    28. ' propertyString &= "'" & obj & "'" & ","
    29. 'Next
    30. 'sr.WriteLine(propertyString.Replace("'"c, """"c))
    31. 'sr.Close()
    32. End Sub
    33. End Class



    Deklarative Angabe des ControlDesigners:

    VB.NET-Quellcode

    1. <DesignerAttribute(GetType(MyControlDesigner))> _
    2. <ToolboxBitmap(GetType(resfinder), "Log-Blue.ico")> _
    3. Public Class MyDerivedControl
    4. Inherits Control
    5. .....


    Anmerkungen:
    - das Toolbox-Attribute bestimmt hier das Icon welches in der Toolbox angezeigt wird
    - für Components wird analog ein egiener ComponentDesigner verwendet

    Hoffentlich hilft das etwas weiter.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kangaroo“ ()

    Danke für die Hilfestellung.

    Ich habe mich in einige Bereiche des msdns über DesignerAttribute u.ä. eingelesen.
    Das Gefühl, dass ich jetz vil schläuer bin, hab ich nicht, tut aber auch nichts zur Sache mit den Properties..oder?

    Ich habe Versucht deinen Lösungswg zu implementieren, verstehe Ihn aber nicht ganz und stosse aber auf den Fehler:
    "sub "PreFilterProperteies" kann nicht als "Overrides" deklariert werden, das es sub in Basis class nicht überschreibt."

    Wenn ich, wie empfohlen den Spezifierer "Overrides" entferne und versuche die Methode "Manuell" aus "Public Sub New" aufzurufen weiss ich nicht, was ich als Argument angeben muss.

    Dasive schrieb:

    Ich habe mich in einige Bereiche des msdns über DesignerAttribute u.ä. eingelesen.
    Das Gefühl, dass ich jetz vil schläuer bin, hab ich nicht, tut aber auch nichts zur Sache mit den Properties..oder?

    Das Gefühl kenne ich, leider ist das Verständnis über Attribute aber das A und O um sich damit mittelfristig auseinanderszusetzen. In der Kurzform: der Designer ist eine eigene Anwendung in Visual Studio, dessen Aufgabe es ist Klassen und Properties in einer visuellen Form darzustellen und es zudem erlaubt Werte zu verändern.
    Normalerweise müsstest Du um wie in Deinem Beispiel den DesignerCode verändern, um bestimmte Properties nicht darzustellen. Um das Ganze flexibler zu gestalten ,erlaubt MS dem Designer von aussen Anweisungen zu geben, wie er mit der Darstellung von Properties etc. umzugehen hat, und zwar in Form von Attributen.

    Ich habe die Erfahrung gemacht, dass es manchmal weit mehr Aufwand bedeutet eine Anwendung "benutzerfreundlich" zu machen, als den eigentlichen Kern zu programmieren.

    Nehmen wir ein einfaches Beispiel: Du fügst Deiner ererbten Klasse customDataGrid eine neu Property IsActive hinzu:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class CustomDataGrid
    3. Inherits DataGrid
    4. ' Property nicht im Designer anzeigen
    5. <Browsable(False)> _
    6. Public Property IsActive As Boolean = True
    7. End Class

    Das Browsable Attribute gibt dem Designer die Anweisung, die Property IsActive nicht in der Übersicht anzuzeigen, obwohl es im Code selbstverständlich per Me.IsActive angeprochen und verändert werden kann.

    Nächstes Beispiel: unterdrücken der Property Dock im Designer der geerbten Klasse:
    "Beispielcode"

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. '<DesignerAttribute(GetType(MyControlDesigner))> _
    3. Public Class CustomDataGrid
    4. Inherits DataGrid
    5. ' Property nicht im Designer anzeigen
    6. <Browsable(False)>
    7. Public Overrides Property Dock As System.Windows.Forms.DockStyle
    8. Get
    9. Return MyBase.Dock
    10. End Get
    11. Set(ByVal value As System.Windows.Forms.DockStyle)
    12. MyBase.Dock = value
    13. End Set
    14. End Property
    15. End Class

    Die Property Dock wird überschrieben und die Anzeige per Attribute im Designer unterdrückt. Für nicht überschreibbare Properties nimmt man dann analog Shadows

    Will man dagegen eine grössere Menge von Properties in der Anzeige unterdrücken, so kann das Überschreiben ziemlich mühselig werden. Eine bessere Möglichkeit ist es daher der Klasse einen eigenen ControlDesigner zuzuordnen, der dies übernimmt:
    "CustomDataGrid"

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. <DesignerAttribute(GetType(MyDatagridControlDesigner))> _
    3. Public Class CustomDataGrid
    4. Inherits DataGrid
    5. End Class


    Voraussetzung ist das Einbinden der Library System.Design als Verweis.

    Die einfachste Methode erfolgt in 2 Schritten:

    1. ermitteln welche Properties überhaupt vorhanden sind, indem sie in eine Textdatei geloggt werden:
    "Loggen der Properties"

    VB.NET-Quellcode

    1. Public Class MyDataGridControlDesigner
    2. Inherits System.Windows.Forms.Design.ControlDesigner
    3. Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
    4. MyBase.PreFilterProperties(properties)
    5. ' TEST:list all properties here
    6. Dim sb As New System.Text.StringBuilder
    7. Dim i As Integer = 0
    8. For Each obj In properties.Keys
    9. i += 1
    10. If i Mod 8 = 0 Then sb.AppendLine("_")
    11. sb.AppendFormat("""{0}"" , ", obj)
    12. Next
    13. sb.Remove(sb.Length - 2, 2)
    14. Using sw As New System.IO.StreamWriter("D:\properties.txt")
    15. sw.WriteLine(sb.ToString)
    16. End Using
    17. End Sub
    18. End Class


    2. Ausblenden der gewünschten Attribute:
    "Ausblenden von Properties"

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class MyDataGridControlDesigner
    3. Inherits System.Windows.Forms.Design.ControlDesigner
    4. Private Shared ReadOnly _unneededProperties As String() = { _
    5. "AllowSorting", "AlternatingBackColor", "BackColor", "ForeColor", "BorderStyle", "CaptionBackColor", "CaptionForeColor", _
    6. "CaptionFont", "CaptionText", "CaptionVisible", "CurrentCell", "SelectionBackColor", "SelectionForeColor", "-DataSource", "-DataMember", _
    7. "CurrentRowIndex", "TableStyles", "GridLineColor", "GridLineStyle", "ParentRowsLabelStyle", "FirstVisibleColumn", "FlatMode", "HeaderBackColor", _
    8. "BackgroundColor", "HeaderFont", "HeaderForeColor", "LinkColor", "LinkHoverColor", "AllowNavigation", "Cursor", "BackgroundImage", _
    9. "BackgroundImageLayout", "ParentRowsBackColor", "ParentRowsForeColor", "PreferredColumnWidth", "PreferredRowHeight", "ReadOnly", "ColumnHeadersVisible", "ParentRowsVisible", _
    10. "RowHeadersVisible", "RowHeaderWidth", "Text", "VisibleColumnCount", "VisibleRowCount", "Site", "AccessibilityObject", "AccessibleDefaultActionDescription", _
    11. "AccessibleDescription", "AccessibleName", "AccessibleRole", "AllowDrop", "Anchor", "AutoSize", "AutoScrollOffset", "LayoutEngine", _
    12. "BindingContext", "Bottom", "Bounds", "CanFocus", "CanSelect", "Capture", "CausesValidation", "ClientRectangle", _
    13. "ClientSize", "CompanyName", "ContainsFocus", "ContextMenu", "ContextMenuStrip", "Controls", "Created", "DataBindings", _
    14. "DisplayRectangle", "IsDisposed", "Disposing", "Dock", "Enabled", "Focused", "Font", "Handle", _
    15. "HasChildren", "Height", "IsHandleCreated", "InvokeRequired", "IsAccessible", "IsMirrored", "Left", "Location", _
    16. "Margin", "MaximumSize", "MinimumSize", "Name", "Parent", "ProductName", "ProductVersion", "RecreatingHandle", _
    17. "Region", "Right", "RightToLeft", "Size", "TabIndex", "TabStop", "Tag", "Top", _
    18. "TopLevelControl", "UseWaitCursor", "Visible", "Width", "WindowTarget", "PreferredSize", "Padding", "ImeMode", _
    19. "Container", "Modifiers", "GenerateMember", "DefaultModifiers", "ApplicationSettings", "Name_210", "Locked"
    20. }
    21. ' just delete unneeded properties
    22. Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
    23. MyBase.PreFilterProperties(properties)
    24. For Each prop As String In _unneededProperties
    25. If properties.Contains(prop) Then
    26. properties.Remove(prop)
    27. End If
    28. Next
    29. '' TEST:list all properties here
    30. 'Dim sb As New System.Text.StringBuilder
    31. 'Dim i As Integer = 0
    32. 'For Each obj In properties.Keys
    33. ' i += 1
    34. ' If i Mod 8 = 0 Then sb.AppendLine("_")
    35. ' sb.AppendFormat("""{0} "", ", obj)
    36. 'Next
    37. 'sb.Remove(sb.Length - 2, 2)
    38. 'Using sw As New System.IO.StreamWriter("D:\properties.txt")
    39. ' sw.WriteLine(sb.ToString)
    40. 'End Using
    41. End Sub
    42. End Class



    Einschränkung: bestimmte Properties wie DataMember und DataSource erzeugen Exceptions wenn sie unterdrückt werden, da sie vom Designer benötigt werden.

    Das Beispielprojekt findest Du im Anhang:TestControlDesigner.rar

    @ErfinderDesRades thx für das Bedanken