结合 datagridview 和 propertygrid 隐藏重复值

Combining datagridview with propertygrid hiding duplicate values

我正在开发一个具有 datagridviewpropertygrid 的小型应用程序。

在此应用程序中,有一个主要对象 class 和来自主要对象 class 的几个 derived classes

So for example lets call the MainClass and DerivedClass

datagridview 绑定到 BindingList(Of MainClass),当用户选择一个单元格或行时,propertygird 应该显示 DerivedClass properties

我可以设法做到这一点,但是因为我的 MainClass 具有在 DerivedClass 中也可用的属性,所以我有重复的值,因为我只想查看仅存在的属性在 DerivedClass.

中可用

我怎样才能做到这一点?

解决方案可能是这个 post,但遗憾的是,c# 对我来说完全是胡言乱语(我不是一个有经验的程序员..)

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

一种方法是使用 TypeConverter 提供属性,并根据某些条件仅 returns 子 class 属性。但是 属性 网格包含一个 BrowsableAttributes 属性,它允许您告诉它只显示那些带有传递的属性和值的属性。

链接的答案使用自定义属性,但您可以使用其他属性。这将使用 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

要防止 SubWidget 对象显示父属性,请告诉 PropertyGrid 仅显示 Category 为 "SubWidget" 的属性:

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

您传递了一个集合,这意味着您可以拥有多个限定符 - 属性 必须包含所有限定符才能显示。要使用自定义属性:

<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

如果有一个链,如果这些(一个 SubSubWidget 和更多)一个简单的布尔值是不够的,除非您创建多个属性以便仅显示 'last' 项目中的属性。