【问题标题】:How to create an array of the same properties?如何创建具有相同属性的数组?
【发布时间】:2013-05-17 14:35:53
【问题描述】:

差不多,我要做的是创建一个属性网格。它将包含输入 0-5 或输出 1-64 之类的内容,它们将具有名称、id 等子属性。现在我的代码非常简单,并且我单独初始化每个。当我想将它们保存到文本文件并意识到这样做会导致代码墙时,这导致了一个问题。除了能够执行 for 循环之外,我还必须单独抓取每个循环以写入文本文件。我想知道是否有更好的方法来使用数组或列表来执行此操作。

这是我现在拥有的:

        [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; }

每个输入都这样。我到处找,找不到好的解决办法。

【问题讨论】:

    标签: c# winforms propertygrid


    【解决方案1】:

    首先,您必须意识到,在您的 PropertyGrid 上显示时,将您的属性包含在一个集合中会导致它们在集合下被分组在一起。
    因此,拥有一个 strings 和另一个 ints 的集合将破坏您当前的结构,即:

    1. 将成对的属性(名称和 ID)组合在一起;
    2. 在属性网格的根级别上拥有所有属性。

    话虽如此,您可以通过使问题 2 变得更糟来解决问题 1。
    创建两个类:

    • MyClass - 包含 NameIID 属性。
    • MyClassCollection - 一个容器类(很可能使用底层列表)。

    为了缓解问题 #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)
    }
    

    如果你看上面提到的文章,关于容器类的显示文本的调整,你必须对上面的类进行一些调整。

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多