title: How to display Object with sub-class in PropertyGrid
body: <p>I'm going to use PropertyGrid to show my Objects. Here is the info class. The Info class has some properties which is composed of the class type. However, the sub-class doesn't show the properties. Do you have any idea?  </p>
  
  <p>Code snippet: </p>
  
  <pre><code>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";
          }
      }
  }
  </code></pre>
  
  <p><strong>Edited</strong> 
  However, struct case doesn't effect for [TypeConverter(typeof(ExpandableObjectConverter))] attribute. Do you have any idea ? </p>
  
  <pre><code>private DoublePoint _resultMarkPos;
  [CategoryAttribute("Results")]
  [TypeConverter(typeof(ExpandableObjectConverter))]
  public DoublePoint ResultMarkPos
  {
              get { return _resultMarkPos; }
              set { _resultMarkPos = value; }
  }
  
  public struct DoublePoint
  {
          public double x, y;
  }
  </code></pre>