• WinForm 自定义控件 学习笔记三


    要实现一个类型转换器,我们必须要重写(override)四个方法:
           CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换stringInstanceDescriptor类型的能力
           CanConvertTo()――根据类型参数进行测试,判断是否能从当前类型转换成指定的类型。
           ConvertTo()――将参数value的值转换为指定的类型。
           ConvertFrom()――串换参数value,并返回但书类型的一个对象。

     

    ConvertTo的实现,如果转换的目标类型是string,我将Scope的两个属性转换成string类型,并且用一个“,”连接起来,这就是我们在属性浏览器里看到的表现形式

     

     如果转换的目标类型是实例描述器(InstanceDescriptor,它负责生成实例化的代码),我们需要构造一个实例描述器,构造实例描述器的时候,我们要利用反射机制获得Scope类的构造器信息,并在new的时候传入Scope实例的两个属性值。实例描述器会为我们生成这样的代码:this.myListControl1.Scope = new CustomControlSample.Scope(10, 200);在最后不要忘记调用 base.ConvertTo(context, culture, value, destinationType),你不需要处理的转换类型,交给基类去做好了。

     

    ConvertFrom的代码,由于系统能够直接将实例描述器转换为Scope类型,所以我们就没有必要再写代码,我们只需要关注如何将String(在属性浏览出现的属性值的表达)类型的值转换为Scope类型。没有很复杂的转换,只是将这个字符串以“,”分拆开,并串换为Int32类型,然后new一个Scope类的实例,将分拆后转换的两个整型值赋给Scope的实例,然后返回实例。在这段代码里,我们要判断一下用户设定的属性值是否有效。比如,如果用户在Scope属性那里输入了“10200,由于没有输入“,”,我们无法将属性的值分拆为两个字符串,也就无法进行下面的转换,所以,我们要抛出一个异常,通知用户重新输入。   

    转自:http://www.cnblogs.com/guanjinke/archive/2006/12/14/592605.html

    复杂属性的子属性也能编辑:

    实现这些很简单,只需要在这个属性的类型的类型转换器中重载两个方法即可

     1        /// <summary>
     2        /// 使用指定的上下文返回该对象是否支持属性 (Property)。
     3        /// </summary>

     4        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
     5        {
     6            return true;
     7        }

     8
     9        /// <summary>
    10        /// 使用指定的上下文和属性 (Attribute) 返回由 value 参数指定的数组类型的属性 (Property) 的集合。
    11        /// </summary>

    12        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, System.Attribute[] attributes)
    13        {
    14            return TypeDescriptor.GetProperties(typeof(SimpleCustomType), attributes);
    15        }

    16

    转自:

    http://www.cnblogs.com/luqingfei/archive/2007/03/14/674797.html

    设置属性的默认值:

    http://www.cnblogs.com/luqingfei/archive/2007/03/14/674734.html
          

  • 相关阅读:
    Sql日期时间格式转换;取年 月 日,函数:DateName()、DATEPART()
    @@ROWCOUNT (Transact-SQL)
    C#调用存储过程简单完整例子
    C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法
    C#反射技术的简单操作(读取和设置类的属性)
    .NET调用Java写的WebService
    蓝牙错误提示
    sql开启xp_cmdshell
    网页手机宽度
    对称加密算法比较
  • 原文地址:https://www.cnblogs.com/johnwonder/p/1667046.html
Copyright © 2020-2023  润新知