Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在属性网格中展开集合而不修改类?_C#_Vb.net_Propertygrid_Typedescriptor - Fatal编程技术网

C# 在属性网格中展开集合而不修改类?

C# 在属性网格中展开集合而不修改类?,c#,vb.net,propertygrid,typedescriptor,C#,Vb.net,Propertygrid,Typedescriptor,此方法适用于除集合以外的所有对象: 集合的显示方式如下: 所以,即使它们是可扩展的,在属性网格中也没有多大用处 下面是我正在寻找的示例(截图取自): 链接文章还包含一些代码,这些代码可以实现这一点,但是需要修改原始类。在它和我之前的问题之间,我提出了一些想法,但我在使用System.ComponentModel名称空间方面不是很流利 下面是一个简化的测试用例(具有一个集合类型属性的自定义类,其中包含一个自定义类型的对象,该对象具有一个字符串属性): 导入System.Component

此方法适用于除集合以外的所有对象:

集合的显示方式如下:

所以,即使它们是可扩展的,在属性网格中也没有多大用处

下面是我正在寻找的示例(截图取自):

链接文章还包含一些代码,这些代码可以实现这一点,但是需要修改原始类。在它和我之前的问题之间,我提出了一些想法,但我在使用
System.ComponentModel
名称空间方面不是很流利

下面是一个简化的测试用例(具有一个集合类型属性的自定义类,其中包含一个自定义类型的对象,该对象具有一个字符串属性):

导入System.ComponentModel
公开课表格1
次新
'设计器需要此调用。
初始化组件()
'在InitializeComponent()调用之后添加任何初始化。
Me.AssignTypeConverter(属于MyCustomClassCollection、ExpandableObjectConverter)()
端接头
私有子表单1_Load(发送方作为对象,e作为事件参数)处理Me.Load
将集合设置为新的MyCustomClassCollection
添加(带有{.MyCustomProperty=“Hello”}的新MyCustomClass)
将容器设置为新的MyCustomClassCollectionContainer(集合)
Me.PropertyGrid1.SelectedObject=容器
端接头
专用子AssignTypeConverter(属于IType、IConvertType)()
System.ComponentModel.TypeDescriptor.AddAttributes(GetType(IType),
新的System.ComponentModel.TypeConverterAttribute(GetType(IConverterType)))
端接头
末级
公共类MyCustomClass
公共属性MyCustomProperty作为字符串
末级
公共类MyCustomClassCollection:继承(MyCustomClass的)System.Collections.ObjectModel.Collection
末级
公共类MyCustomClassCollectionContainer
将项目设置为MyCustomClassCollection
作为MyCustomClassCollection的公共只读属性项
得到
退货项目
结束
端属性
子新建(项目作为MyCustomClassCollection)
_项目=项目
端接头
末级
建议的解决方案(伪代码,不编译)

导入System.ComponentModel
公共类MyCustomClassTypeDescriptor:继承ExpandableObjectConverter
公共重写函数GetProperties(上下文为ITypeDescriptorContext,
值作为对象,属性()作为属性)_
As PropertyDescriptorCollection
将pds变暗为新属性DescriptorCollection(无)
Dim lst作为IList(对象的)=DirectCast(值,IList)
对于i作为整数=0到lst.Count-1
作为MyCustomClass=DirectCast的Dim项(第一项,MyCustomClass)
'编译错误-无法实例化抽象类
Dim pd作为新的PropertyDescriptor(项目)
pds.Add(pd)
下一个
返回pds
端函数
末级
然后在运行时应用此自定义对象转换器

这样行吗?我错过了什么?欢迎提出任何建议


注意:上面是VB.NET,但是如果你说C,请随意使用它。

太长了,无法在注释中继续,但是类似这样的东西如何-一个自定义
ExpandableObjectConverter
将每个集合项转换为属性(ItemX),以及一个获取适当项的自定义属性描述符

Public类MyCollectionTypeDescriptor(将TColl作为集合(TItem的集合),TItem)
继承ExpandableObjectConverter
公共重写函数GetProperties(上下文作为ITypeDescriptorContext,值作为对象,属性()作为属性)作为PropertyDescriptorCollection
Dim coll=DirectCast(值,TColl)
Dim props(coll.Count-1)作为PropertyDescriptor
对于i=0到coll.Count-1
道具(i)=新的MyCollectionPropertyDescriptor(TColl、滴度)(“项目”和CStr(i))
下一个
返回新属性DescriptorCollection(道具)
端函数
末级
公共类MyCollectionPropertyDescriptor(属于TColl,TItem)
继承PropertyDescriptor
私有_索引为整数=0
Public Sub New(名称为字符串)
MyBase.New(名称,无)
Dim indexStr=Regex.Match(名称“\d+$”).Value
_索引=CInt(indexStr)
端接头
公共重写函数CanResetValue(组件作为对象)为布尔值
返回错误
端函数
公共重写只读属性ComponentType作为类型
得到
返回GetType(TColl)
结束
端属性
公共重写函数GetValue(组件作为对象)作为对象
Dim coll=直接广播(组件、集合(滴度))
返回coll(_索引)
端函数
公共重写只读属性IsReadOnly为布尔值
得到
返回真值
结束
端属性
公共重写只读属性PropertyType作为类型
得到
返回GetType(TItem)
结束
端属性
公共替代子重置值(组件作为对象)
端接头
公共覆盖子集合值(组件作为对象,值作为对象)
端接头
公共重写函数应将值(组件作为对象)序列化为布尔值
返回错误
端函数
末级
您可以使用以下方法将所有内容与类关联:

Me.AssignTypeConverter(属于MyCustomClass、ExpandableObjectConverter)()
AssignTypeConverter(属于MyCustomClassCollection,MyCollectionTypeDescriptor(属于MyCustomClassCollection,MyCustomClass))()

它应该列出主属性网格中的每个项,并且每个项都可以内联展开。这就是您要找的吗?

是否要在收藏中添加/删除项目?如果是这样,您将需要一个CollectionEditor和几个片段来处理设计器序列化。我不完全确定你在干什么,但你也可能是