如何创建相同属性的数组?

时间:2013-05-17 14:35:54

标签: c# winforms propertygrid

所以,我正在尝试做的是创建一个属性网格。它将保存输入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; }

对于每个输入,它都是这样的。我一直在寻找,我找不到一个好的解决方案。

1 个答案:

答案 0 :(得分:0)

首先,您必须意识到,当您在PropertyGrid上显示时,在集合中包含您的属性会使它们在它下面组合在一起。
因此,拥有string s和int s的集合会破坏您当前的结构:

  1. 将成对的属性(名称和ID)组合在一起;
  2. 在属性网格的根级别拥有所有属性。
  3. 话虽如此,你可以通过使#2更糟糕来解决问题#1 创建两个类:

    • MyClass - 包含NameIID属性。
    • MyClassCollection - 容器类(最有可能使用基础List)。

    要缓解问题#2,您可以添加代码以在初始化as shown here展开所有节点。

    如果您尝试此操作,您会注意到“容器”(MyClassCollectionMyClass)在显示时会在其旁边显示一些不需要的描述文字。 这是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)
    }
    

    如果您查看上面提到的文章,关于调整容器类的显示文本,您将不得不对上面的类进行一些调整。