如何在PropertyGrid中显示带有子类的Object

时间:2013-08-31 10:07:20

标签: c# propertygrid

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

代码段:

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

2 个答案:

答案 0 :(得分:5)

您需要使用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; }
    }

答案 1 :(得分:1)

您的代码很好,但您在课堂声明中忘记了一小部分额外信息:public class MyClass : ExpandableObjectConverter

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

[TypeConverter(typeof(ExpandableObjectConverter))]
public class info : ExpandableObjectConverter
{
    private int _id;

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

}

下次不要忘记那部分......