time 
设为首页】【收藏本站
当前位置: 主页 > 程序设计 > .net > Visual Studio > 在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)

时间:2010-12-01 23:49 点击:2021次 字体:[ ]




本文目的:

创建一个在属性窗口中可折叠的属性


    什么是在属性窗口中可折叠的属性?废话少说,先上图,看看图一马上就明白了。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

图一

    在大多数服务器控件的属性窗口中可以看到如上图所示的Font属性,这个属性是用于设置控件中文字的字体。由于文字字体包括是否加粗、是否斜体、使用什么字体、字体大小是多少等内容,因此,可以把这个内容以子属性的方式放在Font属性下,而这个Font属性就是一个在属性窗口中可折叠的属性。

    我们接着《在VS2008中创建自定义控件(九)添加属性》来,现在我们要添加一个唐诗作者的属性,由于古人除了姓名之外,还有字、号,所以,我们设计唐诗作者这个属性要包含三个子属性:姓名、字、号——明眼人一看就明白了,“作者”这个属性就是一个类,因此,我们先创建一下作者类,如下所示。

 

  1. /// <summary>  
  2. /// 作者类  
  3. /// </summary>  
  4. public class Author  
  5. {  
  6.     //姓名  
  7.     private string _name = null;  
  8.     //字  
  9.     private string _courtesyName = null;  
  10.     //号  
  11.     private string _selfTitled = null;  
  12.     /// <summary>  
  13.     /// 姓名  
  14.     /// </summary>  
  15.     public string Name  
  16.     {  
  17.         get 
  18.         {  
  19.             return _name;  
  20.         }  
  21.         set 
  22.         {  
  23.             _name = value;  
  24.         }  
  25.     }  
  26.       
  27.     /// <summary>  
  28.     /// 字  
  29.     /// </summary>  
  30.     public string CourtesyName  
  31.     {  
  32.         get 
  33.         {  
  34.             return _courtesyName;  
  35.         }  
  36.         set 
  37.         {  
  38.             _courtesyName = value;  
  39.         }  
  40.     }  
  41.       
  42.     /// <summary>  
  43.     /// 号  
  44.     /// </summary>  
  45.     public string SelfTitled  
  46.     {  
  47.         get 
  48.         {  
  49.             return _selfTitled;  
  50.         }  
  51.         set 
  52.         {  
  53.             _selfTitled = value;  
  54.         }  
  55.     } 

    创建了一个“作者”类之后,为唐诗类添加一个作者属性,该属性就是刚才创建的类,如以下代码所示。

 

  1. private Author _author = new Author();  
  2. /// <summary>  
  3. /// 唐诗的作者  
  4. /// </summary>  
  5. [Category("Data")]              //放到“数据”分组中  
  6. [Browsable(true)]               //该项属性是否会显示在控件的“属性”窗口中  
  7. [Description("诗的作者")]       //属性的说明  
  8. public Author PoetryAuthor  
  9. {  
  10.     get 
  11.     {  
  12.         return _author;  
  13.     }  
  14.     set 
  15.     {  
  16.         _author = value;  
  17.     }  

    添加完“作者”属性之后,我们在自定义控件的属性窗口中可以看到PoetryAuthor属性选项,如下图所示。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

图二

 

    切换到aspx文件的源代码页,我们也可以看到在源代码页中看到PoetryAuthor属性,如下图所示。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

图三

 

 

    值得说明的是,由于“姓名”、“字”、“号”属性都是“作者”类下的属性,而作者是唐诗属性,所以,在源代码页中是不存在name、CourtesyName、SelfTitled属性的,如下图所示。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

图四

 

    因为“姓名”、“字”和“号”属性是“作者”的属性,所以可以在cs页面中设置该属性,如下图所示。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

图五

 

    那么,要怎么才能在aspx页面的源代码中设置“姓名”、“字”和“号”属性呢?这个时候,我们就要在“作者”属性上添加一个特性了,如以下代码所示。

 

  1. /// <summary>  
  2. /// 唐诗的作者  
  3. /// </summary>  
  4. [Category("Data")]              //放到“数据”分组中  
  5. [Browsable(true)]               //该项属性是否会显示在控件的“属性”窗口中  
  6. [Description("诗的作者")]       //属性的说明  
  7. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  
  8. public Author PoetryAuthor  
  9. {  
  10.     get 
  11.     {  
  12.         return _author;  
  13.     }  
  14.     set 
  15.     {  
  16.         _author = value;  
  17.     }  

    在以上代码中,为PoetryAuthor属性加上了一个DesignerSerializationVisibility特性,该特性主要作用是说明该项控件的属性是否在网页的源代码中显示。DesignerSerializationVisibility()方法的参数有以下三种:

    1、DesignerSerializationVisibility.Hidden:该参数说明在代码生成器中不生成属性代码。如果在PoetryAuthor属性的特性中设为该值,而在aspx的源文件中将看不到PoetryAuthor属性,也就是在图三中看不到PoetryAuthor选项。

    2、DesignerSerializationVisibility.Visible:该参数说明在代码生成器中生成属性代码。

    3、DesignerSerializationVisibility.Content:该参数说明在代码生成器中产生的是属性内容的代码,而不是属性本身的代码。

    在本例中,我们使用的第三种参数,让代码生成器中产生属性内容的代码。由于PoetryAuthor属性是一个类,所以,VS会显示这个类中的属性,并使用“-”对它们进行连接。如下图所下。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

图六

 

    需要注意的是,DesignerSerializationVisibility.Content特性只影响aspx源代码中的代码生成器中显示的属性,而不会影响该类的属性。换句话而言,上图中的PoetryAuthor-CourtesyName、PoetryAuthor-Name和PoetryAuthor-SelfTitled属性是不存在的,只是PoetryAuthor属性下三个子属性的表示方式而已。因此,在cs文件中,对PoetryAuthor属性的设置还是如图五所示。

 

    然而,在经过上一步之后,我们只是让自定义控件在源代码中支持类的属性的设置了,但是在属性窗口,PoetryAuthor属性还是没有达到可折叠的效果。

    为什么会没有可折叠的效果呢?这里就要先介绍一下属性窗口中的“类型”了。

    我们为控件定义的每个属性都是有一个“类型”的,例如前面定义的唐诗的内容、标题属性,它的类型都是字符串型(string);唐诗分类是枚举型等,当然,还有我们常用到的整型、日期型、color型等。VS的属性窗口会自动对这些类型进行识别。如果我们设置的属性值与属性类型不相符,那么VS将会报错。而在为属性赋值时,如果类型不同话,可以使用类型转换器将类型转换成相同之后再进行赋值。

    例如,你将颜色设为红色的话,就必须先要将“red”这个字符串转换成Color类型,再赋值给颜色属性。

    之所以在属性窗口中PoetryAuthor属性没有显示出折叠效果,这是因为,PoetryAuthor属性是一个类,而“类”并不是属性窗口中可以默认知道的类型。因此,我们还要对PoetryAuthor属性的类型进行转换,这个时候,我们就要为PoetryAuthor属性再添加一个特性,如以下代码所示。

  1. /// <summary>  
  2. /// 唐诗的作者  
  3. /// </summary>  
  4. [Category("Data")]              //放到“数据”分组中  
  5. [Browsable(true)]               //该项属性是否会显示在控件的“属性”窗口中  
  6. [Description("诗的作者")]       //属性的说明  
  7. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  
  8. [TypeConverter(typeof(ExpandableObjectConverter))]  
  9. public Author PoetryAuthor  
  10. {  
  11.     get 
  12.     {  
  13.         return _author;  
  14.     }  
  15.     set 
  16.     {  
  17.         _author = value;  
  18.     }  

 

 

    在以上代码中,关键代码是“[TypeConverter(typeof(ExpandableObjectConverter))]”,如果属性是一个类的话,可以直接使用ExpandableObjectConverter类来进行转换。

    生成解决方案后,可以在属性窗口看到PoetryAuthor属性成了一个可折叠的属性了。如下图所示。

在VS2008中创建自定义控件(十一)添加在属性窗口中可折叠的属性(一)_www.fengfly.com

本文源码下载



本文地址 : http://www.fengfly.com/plus/view-192994-1.html
标签: VS2008
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: