将datagridview与propertygrid结合使用,隐藏重复值

时间:2016-11-21 14:47:54

标签: vb.net winforms datagridview properties propertygrid

我正在处理一个有datagridviewpropertygrid的小应用程序。

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

  

例如,我们可以调用MainClassDerivedClass

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

Application Capture

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用TypeConverter来提供属性,并且基于某些条件仅返回子类属性。但属性网格包含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所属的属性&#34; SubWidget&#34;:

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

enter image description here

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

<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或更多),则简单的布尔值是不够的,除非您创建多个属性,以便只有来自&#39; last&#39;的属性。项目显示。