0

I'm working on a small application that has a datagridview and propertygrid.

In this application there is a main object class and several derived classes from the main class.

So for example lets call the MainClass and DerivedClass

The datagridview is bound to a BindingList(Of MainClass) and when the user selects a cell or row the propertygird should display the DerivedClass properties

I can manage to do this, but because my MainClass has properties that are also available in the DerivedClass I have duplicate values, as I would only like to see the properties that are ONLY available in the DerivedClass.

How can I achieve this?

The solution could be this post, but sadly c# is total gibberish for me (I am not an experienced programmer..)

Public Class MainClass

    Public Property ComponentType As BodyComponentTypeEnum
    Public Enum BodyComponentTypeEnum
        Cylinder
    End Enum

    Public Property Height As Double
    Public Property Thickness As Double
    Public Property Material As String
    Public Property Diameter As Double
    Public Property Mass As Double
End Class


Public Class DerivedClass

    Inherits MainClass

    Public Property Segments As Integer
    Public Property WeldOrientation As Double

End Class

Application Capture

Mech_Engineer
  • 535
  • 1
  • 19
  • 46
  • If you have the answer already, why not try converting it first and then come back with any issues you encounter afterwards? – A Friend Nov 21 '16 at 14:51
  • It is just creating a custom attribute and using it to control which props are displayed via the [PropertyGrid.BrowsableAttributes](https://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(System.Windows.Forms.PropertyGrid.BrowsableAttributes);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5.1);k(DevLang-VB)&rd=true) – Ňɏssa Pøngjǣrdenlarp Nov 21 '16 at 15:10

1 Answers1

1

One way to do this would be to use a TypeConverter to provide the properties and based on some condition only returns the child class properties. But the property grid includes a BrowsableAttributes property which allows you to tell it to display only those properties bearing the attribute and values passed.

The linked answer uses a custom attribute, but you can use others. This will use the CategoryAttribute.

Public Class Widget
    <Category("Main")>
    Public Property Name As String
    <Category("Main")>
    Public Property ItemType As String

    Public Property Length As Double
    ...

Public Class SubWidget
    Inherits Widget

    <Category("SubWidget"), DisplayName("Weld Orientation")>
    Public Property WeldOrientation As Double

To prevent a SubWidget object from displaying parent properties, tell the PropertyGrid to only display the properties where the Category is "SubWidget":

' target attribute array
Dim attr = New Attribute() {New CategoryAttribute("SubWidget")}
' pass collection to propgrid control
propGrid.BrowsableAttributes = New AttributeCollection(attr)

enter image description here

You pass a collection which means you can have multiple qualifiers - a property must have all if them to show. To use a custom attribute:

<AttributeUsage(AttributeTargets.Property)>
Public Class PropertyGridBrowsableAttribute
    Inherits Attribute

    Public Property Browsable As Boolean
    Public Sub New(b As Boolean)
        Browsable = b
    End Sub

End Class
...
<Category("SubWidget"), DisplayName("Weld Orientation"),
PropertyGridBrowsable(True)>
Public Property WeldOrientation As Double

If there is a chain if these (a SubSubWidget and more) a simple Boolean is not enough unless you create multiple attributes so that only the properties from the 'last' item shows.

Ňɏssa Pøngjǣrdenlarp
  • 38,411
  • 12
  • 59
  • 178