2015-09-18 57 views
2

我創建了一個從DataGridViewColumn繼承的自定義用戶控件。用戶控件的屬性在C#中始終爲false?

此外,我在控件中添加了一些屬性,但我無法在設計時修改它們。

即使我將默認值設置爲true,它仍然是錯誤的。

代碼:

public class ParaGridViewColumn : DataGridViewColumn 
{     
    private bool _Necessary; 
    private bool _ReadOnlyEmpty; 

    [Description("Default cell status."), Category("Behavior"), DefaultValue(false)] 
    public bool Necessary { get { return _Necessary; } set { _Necessary = value;} }       
    [Description("When ReadOnly is true, clear value on the cell or not."), Category("Behavior"), DefaultValue(true)] 
    public bool ReadOnlyEmpty { get { return _ReadOnlyEmpty; } set { _ReadOnlyEmpty = value; }}   

    public ParaGridViewColumn() 
    { 
     this.CellTemplate = new ParaGridViewCell(); 
    } 
} 

新特性可以在窗口上顯示,但它們的默認值都是假的。

我將它們更改爲true,再次輸入並打開此窗口,它仍然是錯誤的。

但是,我可以定期修改其他屬性。這意味着我沒有鎖定這個控件。 enter image description here

這是爲什麼? 我做錯了什麼?

非常感謝。

+0

我在你的問題中加了'winforms'標籤。 –

回答

1

的第一個問題是[DefaultValue(true)]ReadOnlyEmpty而不是設置它的真正價值。

您尚未將屬性的默認值設置爲true。 實際上[DefaultValue(true)]幫助CodeDomeSerizalizer序列化此屬性的值,如果屬性值不等於此默認值。 您應該在構造函數或_ReadOnlyEmpty中設置ReadOnlyEmpty= true

private bool _ReadOnlyEmpty=true; 

這裏的問題是,當你設置屬性在屬性網格真,關閉窗體時,序列化器將不序列真正的價值,因爲你說,這是默認的,但你有沒有將其設置爲true,所以它將仍然是錯誤的。

的第二個問題是,如果你想堅持的值,你應該重寫基類的Clone,並提供包含您的自定義屬性的克隆副本。

public override object Clone() 
{ 
    ParaGridViewColumn column = (ParaGridViewColumn)base.Clone(); 
    //Uncomment if you have ParaGridViewCell 
    //column.CellTemplate = (ParaGridViewCell)CellTemplate.Clone(); 
    column.Necessary = this.Necessary; 
    column.ReadOnlyEmpty = this.ReadOnlyEmpty; 
    return column; 
} 
+0

我真的很感謝你的幫助! –

+0

歡迎您:) –

1

那麼,我找到了解決方案,失去了重載克隆功能。

public override object Clone() 
{ 
    ParaGridViewColumn c = (ParaGridViewColumn)base.Clone(); 

    c._Necessary = this._Necessary;  
    c._ReadOnlyEmpty = this._ReadOnlyEmpty;    
    return c; 
} 
+0

幹得好,+1.5),表示你的努力去尋找答案,併發布其他用戶的:) –

+0

但還是建議閱讀我的答案的答案,希望對您有所幫助:) –

相關問題