用户控件的属性在C#中总是为false?

时间:2015-09-18 02:52:22

标签: c# winforms user-controls datagridviewcolumn

我创建了一个继承自DataGridViewColumn的自定义用户控件。

此外,我在控件中添加了一些属性,但我无法在设计时修改它们。

即使我将默认值设置为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();
    }
}

新属性可以显示在窗口中,但它们的默认值为false。

我将它们更改为true,再次进入并打开此窗口,它仍然是假的。

但是,我可以定期修改其他属性。这意味着我没有锁定这个控件。 enter image description here

为什么? 我做错了吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

第一个问题是[DefaultValue(true)]ReadOnlyEmpty,而没有为其设置真值。

您尚未将property的默认值设置为true。 实际上[DefaultValue(true)]有助于CodeDomeSerizalizer在属性值不等于此默认值时序列化此属性的值。 您应该在构造函数中设置ReadOnlyEmpty= true或者在_ReadOnlyEmpty中设置。

private bool _ReadOnlyEmpty=true;

这里的问题是当你在属性网格中将属性设置为true时,关闭表单时,序列化程序不会序列化true值,因为你说它是默认值但你没有将它设置为true,所以它将保持为false。

第二个问题是,如果您希望值保持不变,则应覆盖基类的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;
}

答案 1 :(得分:1)

好吧,我找到了解决方案,失去了覆盖克隆功能。

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

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