刚加完班,在公司过夜咯,但总是有一个问题围绕着我,非要做个记录才行,呵呵,本人有点笨,做个备忘总是好的嘛!这也是此博客为什么最近这么重视的,哈哈!言归正传!在Winform自定义控件过程中,经常会碰到给控件提供默认值,往往通过DefaultValue来提供默认值,但有时候却实现不了默认值的设置!
DefaultValue属性可以让我们的公开属性在设计时、运行时等提供默认值,这个默认值可以让我们在没有额外提供一个值的时候,程序就可以使用默认值了,如下:
private int _myproperty;
[DefaultValue(100)]
public int myProperty
{
set
{
_myproperty=value;
}
get
{
return _myproperty;
}
}
进行过自定义控件开发的人都知道,如上代码应该是有效的!达到属性定义的目的,且能够提供默认值,这个默认值在设计时、运行时均有效,但是,有些特殊的数据类型或开发方式,往往让DefaultValue失效,如要为背景色提供一种默认值,怎么办?如下:
[DefaultValue(typeof(Color),"Black")]
public override Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor=value;
}
}
兴奋及了,我们可以实现背景的默认值设置了,但,兴奋过头了,默认值设置失效了!
分析情况为:我们的默认值数据类型复杂(其为Color类型)、属性的定义方式复杂(其为重写方式)等,由此,失效的原因会不会是.net引擎的bug?其实不然,早在.net1.1版本出现的时候,这种情况的出现,MS已经提出,并有意要让工程师解决,由此,这个并不时.net引擎的bug!
记得几年前见过一篇英文文章特意为DefaultValue设置默认值提供了解决方案,但是,由于时间关系,我就不找这篇文章并翻译了,我的英文也很菜,哈哈!
我这里提供一种很多人都懂的方式(非如上英文解决方案的)吧,我们在定义自定义控件时,如果要为属性提供默认值,即我们在其构造函数或初始化函数中进行设置就可以了:
1,构造函数中实现默认值(如实现如上背景默认值):
public partial class MyUserControl: UserControl
{
public MyUserControl()
{
InitializeComponent();
base.BackColor = System.Drawing.Color.Black;//重写BackColor的目的是为了为其提供默认值,但,多语言转换中会让重写的“Black”转换失效
}
}
2,自定义控件初始化函数实现默认值(如实现如上背景默认值):
或把base.BackColor这行代码放到InitializeComponent()中。
3,等等!
由于这段时间,团队中有几个新同事均问过这个问题,由此今晚就做个备忘了,说错了望指教!-_-!
晚安!梦周公去了!