我正在处理一个有datagridview
和propertygrid
的小应用程序。
在此应用程序中,主要对象中有一个主对象class
和几个derived classes
。
例如,我们可以调用
MainClass
和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
答案 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)
您传递了一个集合,这意味着您可以拥有多个限定符 - 如果要显示,则属性必须包含所有属性。要使用自定义属性:
<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;的属性。项目显示。