2011-03-10 39 views
1

我有類PGMain作爲SelectedObject PropertyGrid中PropertyGrid中顯示類的成員,同時也是班

  [DefaultPropertyAttribute("Basic")] 
[Serializable] 
public class PGMain 
{  
    private TestClass m_TEST = new TestClass(); 
    [CategoryAttribute("TEST")] 
    public TestClass TEST 
    { 
     get { return m_TEST; } 
     set { m_TEST = value; } 
} 
    // More members are here 
} 

現在我想擴大的TestClass PropertyGrid中的成員。所以,我試過如下:

[Serializable] 
[DescriptionAttribute("Expand to see the options for the application.")] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
public class TestClass : ExpandableObjectConverter 
{ 
    [CategoryAttribute("test-cat"), DescriptionAttribute("desc")]   
    public string Name = ""; 
    [CategoryAttribute("test-cat"), DescriptionAttribute("desc")] 
    public object Value = null; 
    [CategoryAttribute("test-cat"), DescriptionAttribute("desc")] 
    public bool Include = true; 

    public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destinationType) 
    { 
     if (destinationType == typeof(TestClass)) 
      return true; 

     return base.CanConvertTo(context, destinationType); 
    } 
} 

的結果是,有在PropertyGrid中的TestClass中的前一個可擴展的圖標,但它不能擴展。我錯過了什麼? 要明確:我可以展示PGMain類的可擴展成員,但不能展示PGMain類成員的可展開成員,如PGMain中的測試成員。


編輯:

人無我有2班不是1

[DefaultPropertyAttribute("Basic")] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
public class fooA 
{ 
    private fooB m_TestMember = new fooB(); 
    [Browsable(true)] 
    [CategoryAttribute("Test category"), DescriptionAttribute("desctiption here")] // <<<<< this one works. 
    [TypeConverter(typeof(fooB))] 
    public fooB TestMember 
    { 
     get { return m_TestMember; } 
     set { m_TestMember = value; } 
    } 

} 

[DefaultPropertyAttribute("Basic")] 
[TypeConverter(typeof(ExpandableObjectConverter))] 
public class fooB 
{ 
    private string m_ShowThisMemberInGrid = "it works"; // <<<<< this doesn NOT work 
    [CategoryAttribute("Tile"), DescriptionAttribute("desctiption here")] 
    public string ShowThisMemberInGrid 
    { 
     get { return m_ShowThisMemberInGrid; } 
     set { m_ShowThisMemberInGrid = value; } 
    } 

    public override string ToString() 
    { 
     return "foo B"; 
    } 
} 

但我確實解決問題(巧合)。看來公共變量沒有在propertygrid中列出。它必須是獲得者和制定者的屬性。這是解決方案。所以上面的代碼解決了這個問題。無論如何感謝您的回覆:)。

+1

您需要定義的C#的屬性,而不是字段。屬性網格看不到字段。 – 2011-03-10 12:58:39

回答

1

對不起,我錯誤地解釋了這個問題。

你可以找到關於這些鏈接的更多細節

  1. http://msdn.microsoft.com/en-us/library/aa302326.aspx#usingpropgrid_topic6a
  2. http://www.codeproject.com/KB/miscctrl/bending_property.aspx
  3. http://msdn.microsoft.com/en-us/library/aa302334.aspx

希望它能幫助:)

UPDATE:

我複製了代碼here

並修改成這樣。

public class SamplePerson 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 
    public Person Person 
    { 
     get; 
     set; 
    } 
} 

並在窗體我做了什麼樣

SamplePerson h = new SamplePerson(); 
h.Person = new Person 
{ 
    Age = 20, 
    FirstName = "f", 
    LastName = "l" 
}; 
this.propertyGrid1.SelectedObject = h; 

及其對我的工作。

Property Grid

提供可瀏覽假你不想在屬性網格顯示性能。

[Browsable(false)] 
public bool Include 
{ 
get;set; 
} 

+0

不,我想顯示testClass的成員就像一個矩形例如。您可以展開矩形並編輯它的X,Y,寬度,高度成員。這正是我想要的課程。 – Napoleon 2011-03-10 12:09:15

+0

感謝您的答覆。我已經閱讀了其中3個鏈接中的2個,但沒有一個向我顯示解決方案。它們都使用包含像字符串,布爾值,整數等成員的選定對象,但不是具有可以像Rectangle一樣展開的類成員或結構成員的選定對象。但是我知道解決方案位於「TestClass」中的某處,而不是在PGMain中,因爲Rectangle成員可以工作。 – Napoleon 2011-03-10 12:23:05

4

錯誤:

[CategoryAttribute("Tile"), DescriptionAttribute("desctiption here")] 
public string Name = ""; 

好:

private string m_Name = new string(); 
    [CategoryAttribute("Tile"), DescriptionAttribute("desctiption here")] 
    public string Name 
    { 
     get { return m_Name; } 
     set { m_Name = value; } 
    } 
相關問題