c# - PropertyGrid 可以在没有对象的情况下使用吗?

标签 c# winforms dynamic customization propertygrid

我有一个应用程序,需要在其中编辑一些数据,而 PropertyGrid 结构在视觉上是满足我的需求的最佳选择。但是,PropertyGrid 获取对象的公共(public)属性并将它们显示在网格中。 (带有属性的附加选项)。但是,我没有这样的对象,因为我需要编辑的键值对列表是动态的。

理想的解决方案是这样的:

public class GridParam
{
    // ... several constructors here, one for each type
    // ... or a single one but with generic class, does not matter

    public String Name { get; set; }
    public Object Value { get; set; }
    public Type ItemType { get; set; }
}

GridParam stringParam = new GridParam("Address", "2534 Barkeley Av.");
GridParam numberParam = new GridParam("Year", 2012);

NewKindOfPropertyGrid grid = new NewKindOfPropertyGrid();
grid.AddParam(stringParam);
grid.AddParam(numberParam);

上面的代码将生成一个如下所示的属性网格: enter image description here

PropertyGrid 或任何其他现有控件是否可以实现类似的功能(至少看起来与 PG 类似)? 语法不必与我编写的类似,但它需要能够接受此类动态属性的集合,而无需定义类...

最佳答案

这里有两个选择。

第一个(在我看来更简单)是实现 ICustomTypeDescriptor interface在一个需要 IEnumerable<T> 的类(class)上您的GridParam实例。

PropertyGrid class实际上并没有直接使用反射;相反,它使用 TypeDescriptor class获取有关对象实例的元数据,默认情况下使用反射。

但是,如果您实现ICustomTypeDescriptor ,然后 PropertyGrid将获得从 TypeDescriptor 获得的所有信息从你的实现。您只需向其提供您希望其显示的内容即可。

因此在这种情况下,您将拥有 GetProperties 执行返回一个 PropertyDescriptorCollection 填充有 PropertyDescriptor 对于您的每个 GridParam实例。

另一个(可能)更困难的选项是动态创建类型,并将其绑定(bind)到该类型(因为 PropertyGrid 需要一个 object 来绑定(bind))。当然,您确实在某种程度上复制了 ICustomTypeDescriptor 的实现的大部分内容。会做,所以最好选择前者。

关于c# - PropertyGrid 可以在没有对象的情况下使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9289456/

相关文章:

c# - 确定 DynamicObject 成员访问的预期类型

c++ - 生成组合的动态迭代规划

动态构建路由{或动态组件导入} Angular 2

c# - 在 C# 中获取 vtable 地址?

c# - 包含子查询的 View 未显示在 DataMember 中

c# - 约会时间? AddDays 扩展方法

c# - 使用 DataGridView.SelectedRows 作为另一个 DataGridView 的数据源

c# - 从列表中过滤重复的 URL 域 c#

vb.net - 使用 winforms .net 6 vb.net 任务栏图标上的进度条

c# - 关闭 HttpRequestValidationException 日志记录?