关于DefaultValue属性定义默认值(有时失效)的一点看法!

博客讨论了在Winform自定义控件中使用DefaultValue属性设置默认值时遇到的问题,特别是对于复杂数据类型和重写属性的情况。当DefaultValue无法正常工作时,作者建议在控件的构造函数或初始化函数中直接设置默认值作为替代解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        刚加完班,在公司过夜咯,但总是有一个问题围绕着我,非要做个记录才行,呵呵,本人有点笨,做个备忘总是好的嘛!这也是此博客为什么最近这么重视的,哈哈!言归正传!在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,等等!



        由于这段时间,团队中有几个新同事均问过这个问题,由此今晚就做个备忘了,说错了望指教!-_-!

        晚安!梦周公去了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值