我创建了一个继承自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,再次进入并打开此窗口,它仍然是假的。
为什么? 我做错了吗?
非常感谢。
答案 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;
}