上一篇文章我已经介绍了TypeConverterAttribute元数据的作用,本文将通过代码向你展示具体的实现。在这个例子中,我要给控件添加一个复杂的属性,这个属性对这个控件没有什么功用,纯粹是为了演示,有些牵强附会了。
       现在在前一篇文章中的创建的控件代码中添加一个Scope属性:

[Browsable(true)]
        publicScope Scope
        {
            get
            {
                return _scope;
            }
            set
            {
                _scope = value;
            }
        }

这个属性的类型是Scope类,代码如下:

publicclassScope
    {
        private Int32 _min;
        private Int32 _max;

        public Scope()
        {
        }

public Scope(Int32 min, Int32 max)
        {
            _min = min;
            _max = max;
        }

        [Browsable(true)]
        public Int32 Min
        {
            get
            {
                return _min;
            }
            set
            {
                _min = value;
            }
        }

        [Browsable(true)]
        public Int32 Max
        {
            get
            {
                return _max;
            }
            set
            {
                _max = value;
            }
           
        }
}

添加完属性后,build控件工程,然后在测试的工程里选中添加的控件,然后在属性浏览器里观察它的属性,发现Scope属性是灰的,不能编辑。前一篇文章提到了,在属性浏览器里可以编辑的属性都是有类型转换器的,而.NET框架为基本的类型和常用的类型都提供了默认的类型转换器。接下来我们为Scope类添加一个类型转换器,以便这个属性能够被编辑,而且也可以在源代码文件里自动生成相应的代码。下面是类型转换器的代码:

publicclassScopeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(String)) return true;

            return base.CanConvertFrom(context, sourceType);
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(String)) return true;

            if (destinationType == typeof(InstanceDescriptor)) return true;

            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            String result = "";
            if (destinationType == typeof(String))
            {
                Scope scope = (Scope)value;
                result = scope.Min.ToString()+"," + scope.Max.ToString();
                return result;

            }

            if (destinationType == typeof(InstanceDescriptor))
            {
                ConstructorInfo ci = typeof(Scope).GetConstructor(new Type[] {typeof(Int32),typeof(Int32) });
                Scope scope = (Scope)value;
                return new InstanceDescriptor(ci, new object[] { scope.Min,scope.Max });
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value is string)
            {
                String[] v = ((String)value).Split(',');
                if (v.GetLength(0) != 2)
                {
                    throw new ArgumentException("Invalid parameter format");
                }

                Scope csf = new Scope();
                csf.Min = Convert.ToInt32(v[0]);
                csf.Max = Convert.ToInt32(v[1]);
                return csf;
            }
            return base.ConvertFrom(context, culture, value);
        }
    }

现在我们为类型提供类型转换器,我们在类型前面添加一个TypeConverterAttribute,如下:

[TypeConverter(typeof(ScopeConverter))]
    publicclassScope

添加完以后build工程,然后切换到测试工程,选中控件,在属性浏览器里查看属性,现在的Scope属性可以编辑了,如下图所示: 
         
         我们修改默认的值,然后看看Form设计器为我们生成了什么代码:

this.myListControl1.BackColor =System.Drawing.SystemColors.ActiveCaptionText;
            this.myListControl1.Item.Add(1);
            this.myListControl1.Item.Add(2);
            this.myListControl1.Item.Add(3);
            this.myListControl1.Item.Add(6);
            this.myListControl1.Item.Add(8);
            this.myListControl1.Item.Add(9);
            this.myListControl1.Location =newSystem.Drawing.Point(12, 34);
            this.myListControl1.Name ="myListControl1";
            this.myListControl1.Scope =newCustomControlSample.Scope(10, 200);
            this.myListControl1.Size =newSystem.Drawing.Size(220, 180);
            this.myListControl1.TabIndex =1;
        this.myListControl1.Text ="myListControl1";

关键是这一行this.myListControl1.Scope = new CustomControlSample.Scope(10, 200),Scope类的类型转换器为属性提供了实例化的代码。

本文转自纶巾客博客园博客,原文链接:http://www.cnblogs.com/guanjinke/archive/2006/12/11/589372.html,如需转载请自行联系原作者

WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器相关推荐

  1. Asp.net控件开发学习笔记(三)-控件开发基础

    封装      在asp.net中,控件被分为两类.用户控件和自定义服务器控件.前者就是我们经常用来将一些可复用的内容封装成的.ascx文件.这里主要研究后者. 创建自定义服务器控件      创建自 ...

  2. C#.net 地图控件开发 (一) 控件坐标与地图坐标

    1.       控件坐标与地图坐标的转换 控件坐标是以左上角为基准点(原点0,0),往右为X轴正方向,往下为Y轴正方向的.而地图坐标则是以左下角为基准点,往右为X轴正方向,往上为Y轴正方向,并且可以 ...

  3. 无障碍开发(五)之设置获取无障碍属性值

    设置获取无障碍属性值 为了跨浏览器兼容,总是使用WAI-ARIA属性解析来访问和修改ARIA属性,例如object.setAttribute("aria-valuenow", ne ...

  4. WINFORM控件开发 来源:博客园 作者:纶巾客

    (1)开篇 我本人不是专业的控件开发人员,只是在平常的工作中,需要自己开发一些控件.在自己开发WinForm控件的时候,没有太多可以借鉴的资料,只能盯着MSDN使劲看,还好总算有些收获.现在我会把这些 ...

  5. 今天你写控件了吗?----ASP.net控件开发系列

    今天你写控件了吗?----ASP.net控件开发系列之开篇 早段时间,同事之间很流行打CS,所以那段时间的问候变成了"今天你杀XX了吗?" 控 件开发也许是程序员最能发掘自己创造力 ...

  6. 【转】Asp.net控件开发学习笔记整理篇 - Asp.net客户端状态管理

    最近一直在做MVC项目,对于WEBFORM 好像快忘记了.周末无聊,顺带看看他人的笔记.再次温习下. 复习大纲: 导航.页面生命周期及其它导论 一.服务器控件生命周期 二.控件开发基础 三.Asp.n ...

  7. .net控件开发系列

    此系列我将尽我所能写下去吧,跟大家分享学习控件开发.也希望大家对我多提意见,让我们共同进步                              net控件开发系列 1.net组件开发系列(-)之 ...

  8. Delphi 控件开发步骤

    delphi 控件开发步骤 Delphi控件开发步骤 1.使用Delphi IDE的 Component -> New Component 菜单 2.按照向导逐步完成 3.控件工程文件 4.控件 ...

  9. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色  在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件 ...

最新文章

  1. perl: warning: Setting locale failed. Falling back to a fallback locale (“en_HK.UTF-8“).
  2. 周鸿祎告诫员工:勿盲目把360看成巨头 不四处出击!
  3. nyoj-68--三点顺序
  4. 前台模板 海豚php_GitHub - cbw1820446/DolphinPHP: 海豚PHP——快速开发框架(基于ThinkPHP5.0.3)...
  5. java、oracle对CLOB处理
  6. 蓝桥杯第八届省赛JAVA真题----k倍区间
  7. Eigen官网教程(7)geometry几何模块的实践
  8. python算法精解pdf_python算法精解
  9. 网上书店系统需求分析说明书
  10. 80后小学计算机课上的游戏,80后最值得回味的15个经典课间游戏(组图)
  11. nodejs 查看下载文件路径_Python + selenium + Chrome 模拟登陆QQ邮箱,批量下载附件,本地重命名
  12. 微信小程序自定义tabBar使用
  13. Springboot毕设项目查听课管理系统zkb6w(java+VUE+Mybatis+Maven+Mysql)
  14. Linux软件更新时遇到的各种问题以及解决办法
  15. 微信小程序精品demo:面包旅行:界面设计,文本展示,
  16. 计算机丢失d3dcompile,电脑d3dcompiler43.dll文件丢失怎么办 文件丢失解决方法
  17. 隐秘历史:那场国产金融技术的“核武器试爆”
  18. 腾讯手机QQ团队无障碍化探索的曲折与收获
  19. 面试常见问题:如何回答才得体?
  20. 【下载】初音ミク From Y to Y(内嵌widget,已更新下载地址)

热门文章

  1. air写文件 SecurityError: fileWriteResource 时报错的解决方法
  2. 函数的返回竟然能作为左值
  3. 大数据之-Hadoop之HDFS_HDFS产生背景以及定义---大数据之hadoop工作笔记0048
  4. npm的安装和更新---npm工作笔记002
  5. 大数据之-入门_大数据发展前景---大数据之hadoop工作笔记0005
  6. ES11新特性_动态import---JavaScript_ECMAScript_ES6-ES11新特性工作笔记065
  7. Netty工作笔记0051---Netty核心模块2
  8. SpringCloud学习笔记028---在SpringBoot中整合多数据源_实战项目
  9. HTML5学习笔记---Html5简单理解,发展情况...
  10. java零碎要点---大型软件部署方案,磁盘阵列,raid提升硬盘性能,解决由于集群带来的文件共享问题