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;
}
我创建了一个继承自 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;
}