【问题标题】:How to display Object with sub-class in PropertyGrid如何在 PropertyGrid 中显示带有子类的对象
【发布时间】:2013-08-31 10:07:19
【问题描述】:

我将使用 PropertyGrid 来显示我的对象。这是信息类。 Info 类具有一些由类类型组成的属性。但是,子类不显示属性。你有什么主意吗?

代码sn-p:

using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication_propertyGrid
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            info _in = new info();
            this.propertyGrid1.SelectedObject = _in;
        }
    }

    [DefaultPropertyAttribute("Name")]
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class info
    {
        private int _id;
        [CategoryAttribute("Defaults")]
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _name;
        [CategoryAttribute("Defaults")]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private DoublePoint _resultMarkPos;
        [CategoryAttribute("Results")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public DoublePoint ResultMarkPos
        {
            get { return _resultMarkPos; }
            set { _resultMarkPos = value; }
        }

        public struct DoublePoint
        {
            public double x, y;
        }

        private subInfo1 _sub1;
        [CategoryAttribute("SubInfo")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public subInfo1 SubInfo1
        {
            get { return _sub1; }
            set { _sub1 = value; }
        }

        private subInfo2 _sub2;
        [CategoryAttribute("SubInfo2")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public subInfo2 SubInfo2
        {
            get { return _sub2; }
            set { _sub2 = value; }
        }

        public info()
        {
            this._id = 0;
            this._name = "info";

            this._resultMarkPos.x = 0;
            this._resultMarkPos.y = 0;

            this._sub1 = new subInfo1
            {
                Id = 11,
                Name = "sub11",
            };

            this._sub2 = new subInfo2
            {
                Id = 22,
                Name = "sub22",
            };
        }
    }

    public class subInfo1
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public subInfo1()
        {
            this._id = 0;
            this._name = "sub1";
        }
    }

    public class subInfo2
    {
        private int _id;
        public int Id 
        {
            get { return _id; }
            set { _id = value; }
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public subInfo2()
        {
            this._id = 0;
            this._name = "sub2";
        }
    }
}

已编辑 但是,struct case 对 [TypeConverter(typeof(ExpandableObjectConverter))] 属性没有影响。你有什么主意吗 ?

private DoublePoint _resultMarkPos;
[CategoryAttribute("Results")]
[TypeConverter(typeof(ExpandableObjectConverter))]
public DoublePoint ResultMarkPos
{
            get { return _resultMarkPos; }
            set { _resultMarkPos = value; }
}

public struct DoublePoint
{
        public double x, y;
}

【问题讨论】:

    标签: c# propertygrid


    【解决方案1】:

    你需要使用TypeConverter:

        private subInfo1 _sub1;        
        [CategoryAttribute("SubInfo")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public subInfo1 SubInfo1
        {
            get { return _sub1; }
            set { _sub1 = value; }
        }
        private subInfo2 _sub2;
        [CategoryAttribute("SubInfo2")]
        [TypeConverter(typeof(ExpandableObjectConverter))]
        public subInfo2 SubInfo2
        {
            get { return _sub2; }
            set { _sub2 = value; }
        }
    

    【讨论】:

      【解决方案2】:

      您的代码很好,但您只是在类声明中忘记了一点额外信息:public class MyClass : ExpandableObjectConverter

      这是一个非常基本的用法类:

      [TypeConverter(typeof(ExpandableObjectConverter))]
      public class info : ExpandableObjectConverter
      {
          private int _id;
      
          public int Id
          {
              get { return _id; }
              set { _id = value; }
          }
      
      }
      

      下次别忘了那部分……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-18
        • 2012-06-30
        相关资源
        最近更新 更多