所以,我正在尝试做的是创建一个属性网格。它将保存输入0-5或类似输出1-64之类的东西,它将具有名称,id等子属性。现在我的代码非常简单,我将每个单独初始化。当我想将它们保存到文本文件并意识到这样做会导致代码墙时,这就引起了问题。我不得不单独抓取每一个来写入文本文件。我想知道是否有更好的方法来使用数组或列表执行此操作。
这就是我现在所拥有的:
[CategoryAttribute("Input 0"), DescriptionAttribute("Name of Input 0"), DisplayName("Input 0: Name")]
public string IName_0
{
get {return _Iname[0];}
set {_Iname[0] = value;}
}
[CategoryAttribute("Input 0"), DescriptionAttribute("ID of Input 0"), DisplayName("Input 0: ID")]
public int IID_0
{
get { return _IID[0]; }
set { if ((64 > value) && (value >= 0)) _IID[0] = value; }
}
[CategoryAttribute("Input 1"), DescriptionAttribute("Name of Input 1"), DisplayName("Input 1: Name")]
public string IName_1
{
get { return _Iname[1]; }
set { _Iname[1] = value; }
}
[CategoryAttribute("Input 1"), DescriptionAttribute("ID of Input 1"), DisplayName("Input 1: ID")]
public int IID_1
{
get { return _IID[1]; }
set { if ((64 > value) && (value >= 0)) _IID[1] = value; }
对于每个输入,它都是这样的。我一直在寻找,我找不到一个好的解决方案。
答案 0 :(得分:0)
首先,您必须意识到,当您在PropertyGrid上显示时,在集合中包含您的属性会使它们在它下面组合在一起。
因此,拥有string
s和int
s的集合会破坏您当前的结构:
话虽如此,你可以通过使#2更糟糕来解决问题#1 创建两个类:
MyClass
- 包含Name
和IID
属性。MyClassCollection
- 容器类(最有可能使用基础List)。 要缓解问题#2,您可以添加代码以在初始化as shown here展开所有节点。
如果您尝试此操作,您会注意到“容器”(MyClassCollection
和MyClass
)在显示时会在其旁边显示一些不需要的描述文字。
这是this article派上用场的地方。
您的财产将是:
[DisplayName("Some info here"),
DescriptionAttribute("Some more descriptive info here...")]
virtual public MyClassCollection MyData { get; set; }
并且您的类定义将遵循:
public class MyClass
{
public string Name
{
get { return _name; }
set { _name = value; }
}
public int IID
{
get { return _iid; }
set { if ((64 > value) && (value >= 0)) _iid = value; }
}
private string _name;
private int _iid;
}
public class MyClassCollection : CollectionBase
{
// See the article for code for the overrides (for CollectionBase) and implementation (for ICustomTypeDescriptor)
}
如果您查看上面提到的文章,关于调整容器类的显示文本,您将不得不对上面的类进行一些调整。