结合 datagridview 和 propertygrid 隐藏重复值
Combining datagridview with propertygrid hiding duplicate values
我正在开发一个具有 datagridview
和 propertygrid
的小型应用程序。
在此应用程序中,有一个主要对象 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' 项目中的属性。
我正在开发一个具有 datagridview
和 propertygrid
的小型应用程序。
在此应用程序中,有一个主要对象 class
和来自主要对象 class 的几个 derived classes
。
So for example lets call the
MainClass
andDerivedClass
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' 项目中的属性。