C# 在运行时设置PropertyGrid.SelectedObject

C# 在运行时设置PropertyGrid.SelectedObject,c#,propertygrid,C#,Propertygrid,我有一个如下所示的类: public class DashWidgetParameter { public string Name { get; set; } public Type ValueType { get; set; } public object Value { get; set; } public DashWidgetParameter(string ParameterName, Type ParameterType, object Value)

我有一个如下所示的类:

public class DashWidgetParameter
{
    public string Name { get; set; }
    public Type ValueType { get; set; }
    public object Value { get; set; }

    public DashWidgetParameter(string ParameterName, Type ParameterType, object Value)
    {
        this.Name = ParameterName;
        this.ValueType = ParameterType;
        this.Value = Value;
    }
}
这个类被我的应用程序中的一些其他对象用来存储它们各自的参数。每个对象都有一条线

List<DashWidgetParameter> Parameters = new List<DashWidgetParameter>();
下面是几行类似的内容:

paramList.Add(new DashWidgetParameter("Item Type", typeof(int), 40));
paramList.Add(new DashWidgetParameter("Status Categories", typeof(List<string>), new List<string> { "New", "Configured", "Processed" }));
最后几行对于每个对象都是不同的,所以我不能用一组属性列表定义一个类

我想为用户提供一种可视化的方式,让他们能够编辑每个对象的参数值,我希望我可以使用PropertyGrid控件,但我正在努力让它工作

我没有可以将PropertyGrid.SelectedObject设置为的对象,如果我将其设置为上面定义为列表参数的参数,则PropertyGrid只包含两个属性:计数和容量

是否有一种方法可以遍历我的参数列表并将它们逐个添加到PropertyGrid中?

尝试以下方法:

public class ParameterList {
    public List<DashWidgetParameter> Parameters { get; set; }
}

PropertyGrid.SelectedObject = new ParameterList { Parameters = paramList };

或者,您可以实现自定义视图。

我不明白这是一个怎样的解决方案。如果我这样做,PropertyGrid将只有一个名为Parameters的属性。@DewaldSwanepoel Yes,您将得到带有省略号的按钮来调用项目列表。试试看它是否适合你的需要。好吧,我试过了,但它并不能满足我的需要。首先,正如我所怀疑的,它在PropertyGrid中提供了一个带有name参数的属性。如果我单击集合值的省略号,它会弹出一个集合编辑器,显示作为成员的不同属性,每个成员唯一可以更改的属性是名称,而不是值。@DewaldSwanepoel我明白了。如果涉及到类型object的Value属性,则必须使用类型转换器。无法猜测值的类型,因此编辑字段被禁用。