zoukankan      html  css  js  c++  java
  • Dot Net WinForm 控件开发 (四) 设置属性的默认值

          VS自带的控件大多数据,属性都是有默认值的. 这是怎么实现的. (有人说: 给字段设个初始值呗!) 
          疑点一:  默认值与初始值是等同的吗? 好像是哦?
                         VS中的默认值与初始值是等同的吗? 不知道? (实际上是不等同的.)
        
          从MSDN上可以查到,简单属性与复杂属性的默认值设置又是不一样的.

    如果属性不具有简单的默认值,则可以为属性提供可选方法 ShouldSerialize 和 Reset。如果属性 (Property) 具有简单的默认值,则应用 DefaultValueAttribute 并将默认值提供给属性 (Attribute) 类构造函数。上述机制中的任何一种都可以在设计器中启用下列功能:

    • 该属性在修改了其默认值的情况下,在属性浏览器中提供可视化表示。

    • 用户可以右键单击该属性并选择“重置”将该属性还原为其默认值。

    • 该设计器生成更为有效的代码。



    属性的初始值与默认值不是一个概念, 大家可以很容易地看出来.
    1, 初始值就是当控件第一次被拖到窗体上属性中的值. 对于简单的类型比如int类型, 初始值默认为0, 这是控件类被实例化时分配的.
    2, 默认值是当属性值不为粗体时的那个值就是该属性的默认值.

    来段代码先, (下面是综合了前几篇文章中所提及的代码) 只包含两个属性的控件,一个简单属性,一个简单属性
      1using System.ComponentModel;
      2using System.Windows.Forms;
      3using System.Drawing;
      4
      5namespace CustomControlSample
      6{
      7    public class CustomControl : Control
      8    {
      9        // 注意:这里设置了简单属性的初始值123
     10        private int simpleField = 123;
     11
     12        [Category("我是属性,我怕谁!")]
     13        [Description("我是属性,故我在(属性浏览器中)!")]
     14        [DefaultValue(456)] // 如果属性 (Property) 具有简单的默认值,则应用 DefaultValueAttribute
     15        public int SimpleProperty
     16        {
     17            get return simpleField; }
     18            set { simpleField = value; }
     19        }

     20
     21        // 注意:这里设置了复杂属性的初始值 new SimpleCustomType(1, 2)
     22        private SimpleCustomType complexField = new SimpleCustomType(12);
     23
     24        [Category("我是复杂的属性哦!")]
     25        [Description("我是简单的复杂属性,因为我是由简单的类型和简单的方式定义的。\n定义我的类型很简单,只有两个属性(Min, Max);定义我的body也很简单,只是简单的get, set.")]
     26        [TypeConverter(typeof(SimpleCustomTypeConverter))]
     27        public SimpleCustomType ComplexProperty
     28        {
     29            get return complexField; }
     30            set { complexField = value; }
     31        }

     32
     33        // 如果属性不具有简单的默认值,则可以为属性提供可选方法 ShouldSerialize 和 Reset。
     34        /// <summary>
     35        /// 设置复杂属性的默认值 new SimpleCustomType(8, 9)
     36        /// </summary>

     37        public void ResetComplexProperty()
     38        {
     39            ComplexProperty = new SimpleCustomType(89);
     40        }

     41
     42        /// <summary>
     43        /// 诸如 Visual Studio 之类的设计器可使用 ShouldSerializePropertyName 方法来检查属性是否已不再使用其默认值,
     44        /// 并仅在属性发生改变的情况下将代码写入到窗体中,从而更有效地生成代码。
     45        /// </summary>
     46        /// <returns></returns>

     47        public bool ShouldSerializeComplexProperty()
     48        {
     49            return (ComplexProperty.Min != 8 || ComplexProperty.Max != 9);
     50        }

     51
     52        protected override void OnPaint(PaintEventArgs e)
     53        {
     54            base.OnPaint(e);
     55            e.Graphics.DrawRectangle(Pens.Red, new Rectangle(Point.Empty, new Size(Width - 1, Height - 1)));
     56        }

     57    }

     58
     59    简单的自定义类型
     88
     89    简单的自定义类型的类型转换器
    140}

    141

    强烈建议有需要的同学仔细阅读代码中的注释部分.并在本机上反复实践.

    The end.

  • 相关阅读:
    Flex的DateChooser组件中文显示方法
    FLEX XML XMLList XMLListCollection ArrayCollection相互转换
    开机电脑cpu占用100%
    FLEX 动态绑定chart 数据
    FLEX 数组 转化成 xml
    FLEX 通过url 得到网页内容 xml通信
    FLEX 时间计算
    FlEX 如何调试
    unix,linux,windows 哪个更好,更适合做服务器
    FLEX httpService 用法介绍
  • 原文地址:https://www.cnblogs.com/luqingfei/p/674734.html
Copyright © 2011-2022 走看看