2012-11-14 98 views
2

考慮到有一個屬性行的自定義控件:定製控件屬性

private EMRow[] _rows; 

public CustControl() 
{ 
    InitializeComponent(); 
} 

public EMRow[] Rows 
{ 
    get 
    { 
     return _rows; 
    } 
    set 
    { 
     _rows = value; 
    } 
} 

每個EMRow創建一個文本框,並公開了兩個屬性,一個是文字,一個用於控制本身:

private TextBox _txtValue; 

public EMRow() 
{ 
    if (_txtValue == null) 
     _txtValue = new TextBox(); 
} 

public string Value 
{ 
    get 
    { 
     return _txtValue.Text; 
    } 
    set 
    { 
     _txtValue.Text = value; 
    } 
} 

public TextBox ValueTextBox 
{ 
    get 
    { 
     return _txtValue; 
    } 
    set 
    { 
     _txtValue = value; 
    } 
} 

如果將此自定義控件拖放到窗體上並修改Value屬性,它將更新並保存對designer.cs文件的更改。

當您向下深入到ValueTextBox屬性(再次,所有這些在Visual Studio設計器中,而不是代碼中)並修改屬性時,這些更改不會保存到designer.cs文件中。就設計師而言,甚至沒有創建和引用該屬性的TextBox對象。

我確定這是'按預期行爲'的行爲,但我很難理解爲什麼。我錯過了VS設計師的基礎嗎?

回答

1

一些挖我找到了解決這個問題後,告訴設計師通過增加DesignerSerializationVisibility屬性

private TextBox _txtValue; 

public EMRow() 
{ 
    if (_txtValue == null) 
     _txtValue = new TextBox(); 
} 

public string Value 
{ 
    get 
    { 
     return _txtValue.Text; 
    } 
    set 
    { 
     _txtValue.Text = value; 
    } 
} 

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public TextBox ValueTextBox 
{ 
    get 
    { 
     return _txtValue; 
    } 
    set 
    { 
     _txtValue = value; 
    } 
}  

Winforms Designer: Modify (and keep) properties in sub objects 感謝漢斯序列化這個對象本身!