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

The property of user control always be false in C#?

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

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

即使我将默认值设置为true,它仍然是false。

代码:

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();
    }
}

新属性可以在 window 上显示,但它们的默认值为 false。

我把它们改成true,再次进入打开这个window,还是false

不过,我可以定期修改其他属性。这意味着我没有锁定这个控件。

这是为什么? 我是不是做错了什么?

非常感谢。

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

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

private bool _ReadOnlyEmpty=true;

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

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

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

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

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