.NET Framework为控件设计时属性提供了很多丰富的类,这些属性的功能非常灵活,控制范围广泛,比如可以控制该属性在属性窗口中的显示模式,如:是否在属性窗口中显示该属性,也可以指定此属性必须接收值类型描述,按组分类等,也可以控制文本的标记呈现格式等,甚至可以自己定义一个属性类,实现自己想实现的功能。下面讲一下常用的.NET Framework的属性类对控件的支持功能。
Ø Bindable
指定属性是否可以绑定一个有效数据源,通常使用布尔值进行设置。例如:Bindable(true)。如果使用值true标记属性,表示该属性可以绑定一个有效数据源。
Ø Browsable
指定属性是否应该在属性窗口中显示,使用布尔值设置。一般情况下,对于常用的和比较重要的属性设置Browsable为true,否则,设置Browsable为false。
Ø EditorBrowsable
设置属性在编辑器中的可见性,比如设置在智能提示列表不显示或高级用户才可以看到该属性。
Ø Category
指定属性在属性浏览器中进行分组显示的类别。该设计时特性帮助可视化编辑器将属性进行逻辑分组。通常分为:外观(Appearance)、行为(Behavior)、布局(Layout)、数据(Data)、操作(Action)、键盘(Key)和鼠标(Mouse)等。如果您安装的是中文版的IDE,则默认情况下中文分类和英文分类是通用的,即设置成“数据”或“Data”类别是等价的。
Ø Description
设置显示在属性窗口最下面的描述属性功能的文字说明。
Ø DesignOnly
如果此属性设置为true,表示该属性只能在设计期间使用,不能在页面代码中设置其值。
Ø ReadOnly
设置该属性是否为只读状态。如果此特性设置为true,则在属性窗口能看到属性,但不能设置其值。另外,通过在属性语句体中把 set 语句段去掉也可以起到相同的效果。
Ø Themeable
设置该属性是否支持主题特性,默认情况下属性都支持主题。当该属性与界面无关时可以设置其值为false,禁用该属性的主题功能。
Ø DesignerSerializationVisibility
指定属性是否以及如何在代码中序列化,其值为DesignerSerializationVisibility的枚举值,存在3种设置方式:
— DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不应该序列化属性值;
— DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列化程序序列化属性的值;
— DesignerSerializationVisibility(DesignerSerializationVisibility.Content)指定序列化程序应该序列化属性的内容,而不是属性本身。此字段为只读。Visible为其默认值。
这里说的序列化是指在IDE中的设计器界面切换到代码视图时,看到的代码标记,或反向切换时把代码标记转化到设计器界面。后面讲复杂属性时会通过示例介绍此属性功能。
Ø NotifyParentProperty
指示当此设计特性应用到的属性的值被修改时将通知其父属性。换言之,如果属性的父属性应该在该属性值被修改时接到通知,则向该属性应用NotifyParentProperty特性。通常使用布尔值进行设置。一般常用于复杂属性,通知转换器更新到父级标记。
Ø ParseChildren
使用该设计特性指示当在页面上以声明方式使用控件时,嵌套在服务器控件标记内的XML元素是应该视为属性还是应视为子控件。通常情况下,包含两种声明方式:
— ParseChildren(true)表示将子XML元素作为服务器控件的属性分析;
— ParseChildren(bool childrenasProperty, string defaultProperty),其中childrenasProperty和上面的方式中的布尔值参数意义相同,defaultProperty定义默认情况下将子控件分析为服务器控件的集合属性。
Ø PersistChildren
该设计特性指示设计时是否应将服务器控件的子控件作为内部嵌套控件保持。如果该特性为PersistChildren(true),则将服务器控件的子控件作为嵌套服务器控件标记保持。如果为PersistChildren(false),则将该控件的属性作为嵌套元素保持。
Ø PersistenceMode
指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性,共存在4种枚举设置方式:
— PersistenceMode(PersistenceMode.Attribute)指定属性或事件保持为属性;
— PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)指定属性作为服务器控件的唯一内部文本,如果属性值是HTML编码的,只能对字符串作这种指定;
— PersistenceMode(PersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保持为内部文本,还指示将该属性定义为元素的默认属性,只能指定一个属性为默认属性;
— PersistenceMode(PersistenceMode.InnerProperty)指定属性在服务器控件中保持为嵌套标记,通常用于复杂对象,它们具有自己的持久性属性。
关于以上4种标记的具体用法,下一节会详细介绍。
Ø DefaultValue
指定属性的默认值。此特性的设置需要特别谨慎,假如设置的值不为空,则开发人员在使用时如果自己输入的值与默认值相同,则控件不会装载开发人员输入的值。也就是说此默认值不能指定为具有有效意义或业务意义的实际值。一般设置为空即可。
Ø DisplayName
指定在属性窗口中显示的别名。此别名仅在属性窗口中看到,当转换器转换到代码视图,以及在页面后面的代码中编码还是以实际的属性名称为准,而不是以该别名为准。
Ø ParenthesizedPropertyName
指定属性在属性窗口中显示时,是否带有括号,相当于在Category分组特性基础上的对属性窗口属性集的排序功能,如果不带括号该属性会自动排在该组的前面。
Ø PasswordPropertyText
指定是否设置成密码文本。如果设置为true,则在属性窗口中输入的文本会用特定的密码符号显示,而不是显示原文本;另外,在代码视图中看到的仍为原文本。
Ø TypeConverter
指定用作此特性所绑定到的对象的转换器的类型。用于转换的类必须从TypeConverter继承。使用ConverterTypeName属性来获取为该特性所绑定到的对象提供数据转换的类名。后面会通过代码示例讲解如何自定义一个自己的类型转换器。
Ø Editor
指定该属性的编辑器,如系统的文件编辑器、文本编辑器、颜色编辑器,还有集合编辑器等,也可以自己实现编辑器,具体用法后面会讲到。
Ø ToolBoxItem
此属性为类特性。属于工具箱属性,可以设置当前控件是否在工具箱中显示,以及所在工具箱项的类型名称等信息。默认生成的控件都显示在工具箱中。
Ø ToolBoxData
此特性为类特性,即不是属性的特性,而是类的特性,设置位置也是在类的上面。ToolBoxData表示从工具箱中拖一个控件到设计界面上时默认显示标记格式,如:
[ToolboxData("<{0}:ControlProperty runat=server></{0}:ControlProperty>")]
可以修改参数字符串,定制为自己想要的格式,但要保证所添加的属性为有意义的属性。
Ø DefaultProperty
此特性为类特性。它指定服务器控件的默认属性,例如:[DefaultProperty("Text")]。
指定用黑色粗体显示默认属性特性的属性名称。一般设置比较重要或常用的属性为默认的属性。如TextBox控件的Text属性。
Ø DefaultEvent
此特性为类特性。指定服务器控件的默认事件,例如:[DefaultEvent("OnClicked")]。
指定用黑色粗体显示默认事件特性的事件名称。一般设置比较重要或常用的属性为默认的事件,如Button控件的OnClick事件。
Ø ValidationProperty
此特性为类特性,指定该控件的哪个属性作为验证属性。当该控件与验证控件组合使用时,验证控件会自动验证该特性指定的属性。
Ø AspNetHostingPermission
此属性为JIT编译时代码访问安全属性。需要使用此属性确保链接到控件的代码具有适当的安全权限。Control类带有两个JIT编译时代码访问安全属性标记:
AspNetHostingPermission(SecurityAction.Demand,Level=AspNetHostingPermissionLevel.Minimal)和AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHosting PermissionLevel.Minimal).在使用时应把第一个属性应用于当前开发的控件,第二个属性是可选的,因为继承请求是可传递的,在派生类中仍有效。
Ø ControlBuilder
分析时特性,将自定义控件生成器与控件关联。只有在您希望使用自定义控件生成器,对页分析器用分析控件的声明性语法的默认逻辑进行修改时,才需要应用此特性。如果仅希望指定控件标记中的内容是否与属性或子控件对应,请使用ParseChildrenAttribute,而不要使用自定义控件生成器。
Ø Designer
设计时特性,指定与控件关联的设计器类。控件设计器类用于控制关联的控件在可视化设计器的设计图面上的外观和行为。
还有一些更复杂的,包括在设计模式下的元数据属性类在这里没有列出,因为在后面有专门的章节详细介绍,通过代码示例更容易理解。在这里只要理解上面这些属性类功能,开发一般的控件是没有问题了。
===============
ASP.NET自定义控件属性介绍自定义控件简单属性和复杂属性:
主题是是ASP.NET自定义控件属性,只当分享经验,希望对大家有帮助
我们根据属性的不同表现形式,把其区分为简单属性和复杂属性
下面来看下属性的表现形式
ASP.NET自定义控件属性之简单属性表现形式如下,
asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"/asp:TextBox
属性中含有子属性,称之为复杂对象,如Font属性
ASP.NET自定义控件属性之复杂属性的表现形式如下,
(1)连字符的表现形式
asp:TextBox ID="TextBox1" Text="textbox控件" runat="server" Font-Bold="True"/asp:TextBox
(2)内镶属性的表现形式,如定义样式
asp:DataList ID="DataList1" runat="server" SelectedItemStyle / EditItemStyle / /asp:DataList
(3)内镶集合属性的表现形式,如DropDownList (先不介绍,大家可看MSDN)
asp:DropDownList ID="DropDownList1" runat="server" asp:ListItemx/asp:ListItem asp:ListItemxx/asp:ListItem asp:ListItemxxx/asp:ListItem /asp:DropDownList
下面得好好看
1,ASP.NET自定义控件属性之复杂属性基本使用方法
请看我是怎么做的,关于下面看到了一些元数据,如果你不熟悉,请参考MSDN.
下面一段代码记录一个custom的信息.
1.1 定义枚举
- using System;
- namespace CustomComponents
- {
- /**//// summary
- /// 职业
- /// /summary
- publicenum Metier
- {
- 教师,程序员,作家
- }
- }
1.2定义复杂属性
- using System;
- using System.ComponentModel;
- namespace CustomComponents
- {
- /**//// summary
- /// 地址集合
- /// /summary
- publicclass Address
- {
- private String street = null;
- private String city = null;
- private String state = null;
- private String zip = null;
- public String Street
- {
- get
- {
- return street;
- }
- set
- {
- street = value;
- }
- }
- public String City
- {
- get
- {
- return city;
- }
- set
- {
- city = value;
- }
- }
- public String State
- {
- get
- {
- return state;
- }
- set
- {
- state = value;
- }
- }
- public String Zip
- {
- get
- {
- return zip;
- }
- set
- {
- zip = value;
- }
- }
- }
- }
1.3 呈现控件
- using System;
- using System.ComponentModel;
- using System.Web;
- using System.Web.UI;
- namespace CustomComponents
- {
- publicclass Custom: Control
- {
- private String name = null;
- Address address = new Address();
- private Metier metier;
- privateint age = 0;
- 属性#region 属性
- [Description("年龄")]
- publicint Age
- {
- get
- {
- return age;
- }
- set
- {
- age = value;
- }
- }
- [Description("姓名")]
- public String Name
- {
- get
- {
- return name;
- }
- set
- {
- name = value;
- }
- }
- [Description("职业")]
- public Metier CustomMetier
- {
- get
- {
- return metier;
- }
- set
- {
- metier = value;
- }
- }
- [Description("地址集合")]
- public Address CustomAddress
- {
- get
- {
- return address;
- }
- }
- #endregion
- protectedoverridevoid Render(HtmlTextWriter output)
- {
- output.Write("姓名: " + Name + "br");
- output.Write("年龄: " + Age + "br");
- output.Write("职业: " + CustomMetier + "br");
- output.Write("具体地址: " + CustomAddress.Street + "br 城市: "
- + CustomAddress.City + "br 国籍: " +
- CustomAddress.State + "br 邮编: " + CustomAddress.Zip + "br");
- }
- }
- }
1.4 在ASP.NET页面定义控件,
发现问题:属性不是有效属性,如下图
![属性不是有效属性](http://images.51cto.com/files/uploadimg/20090806/1751110.jpg)
打开后台代码,输入如下代码检查属性,发现属性是存在的,如下图,再打开视图,发现控件能显示属性,唯一的就是不能认识属性为有效属性,在源视图也无法找到这几个属性.
![无法找到这几个属性](http://images.51cto.com/files/uploadimg/20090806/1751111.jpg)
1.5 解决1.4无法显示有效属性的问题,(其实以上的测试已经实现复杂属性了).
解决方法:请在Custom类中的CustomAddress中加入一个元数据(元数据的解释请参考MSDN),如下
- [Description("地址集合")]
- [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
- public Address CustomAddress
- {
- get
- {
- return address;
- }
- }
再次打开源视图,发现编辑器已经支持此属性了,如下图,这样有点意思吧,呵呵
![编辑器已经支持此属性](http://images.51cto.com/files/uploadimg/20090806/1751112.jpg)
虽然源视图上已经支持这个复杂属性了,打开属性面板,发现属性面板并不支持这个复杂属性(因为我们比较懒,不喜欢在源视图里编辑属性,想直接在属性面板编辑属性,下面就称复杂属性是CustomAddress),我们想要达到的效果,是让CustomAddress属性跟Font属性一样(可以折叠)显示在面板上,如下图
![CustomAddress属性显示在面板](http://images.51cto.com/files/uploadimg/20090806/1751113.jpg)
发现问题:属性面板并不支持这个复杂属性
1.6 实现CustomAddress属性折叠效果
解决方法:给Address类添加一个元数据,如下
- [TypeConverter(typeof(ExpandableObjectConverter))]
- publicclass Address
- {. }
编译后,再次打开属性面板,发现CustomAddress属性已经支持折叠效果,如下图
![CustomAddress属性支持折叠效果](http://images.51cto.com/files/uploadimg/20090806/1751114.jpg)
试着在属性面板编辑CustomAddress的子属性,修改好子属性以后然后运行页面,发现子属性修改数据后无效
发现问题:在属性面板编辑复杂属性的子属性无效
1.7 解决属性面板编辑复杂属性的子属性无效的问题
解决方法:为Address类的每个属性加上一个元数据,如下
- [NotifyParentProperty(true)]
- public String Street
- {
- get
- {
- return street;
- }
- set
- {
- street = value;
- }
- }
编译后,回到原asp.net的页面,再次在属性面板里修改子属性,再次运行页面.发现修改后的数据生效了.
好了,以上代码就是连字符形式的复杂属性的实现,我们接着继续,我们希望把CustomAddress属性做为内镶属性使用,即如下代码的形式
- custom:custom id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21"
- CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" /
- /custom:custom
发现问题:无法使用内镶属性
1.8 实现内镶属性
解决方法:在Custom类中给CustomAddress再加入一个元数据(第三个),如下
- [Description("地址集合")]
- [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
- [PersistenceMode(PersistenceMode.InnerProperty)]
- public Address CustomAddress
- {
- get
- {
- return address;
- }
- }
打开源视图(请不要把原来的连字符属性去掉),在控件内部加入如下代码(编辑器已经支持此属性了)
- custom:custom
- CustomAddress-Zip="3100001" CustomAddress-City="杭州1"
- CustomAddress-State="中国1" CustomAddress-Street="不告诉你1"
- id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21"
- CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" /
- /custom:custom
发现问题:查看属性面板,再次修改CustomAddress子属性,然后运行,发现修改后无效果,而且显示的数据仍然是连字符属性的数据(非内镶属性的)
1.9 让ASP.NET控件支持内镶属性
解决方法:给Custom类添加元数据,如下代码
[ParseChildren(true)] public class Custom: Control { }
编译后,再次测试发现属性显示的优先级发生了变化,在内镶属性存在的时候,显示内镶属性,若其中有子属性不存在,则显示连字符属性,大家可以适当更改内镶属性和连字符属性测试变化.
发现问题:在属性面板改变属性时,仍然无法使修改后的数据生效,且修改后,数据退回初始的数据,并且导致内镶属性消失
1.10 解决属性面板的问题
解决方法:给Custom类再添加一个元数据,如下代码
[ParseChildren(true)] [PersistChildren(false)] public class Custom: Control { }
编译后再次修改属性面板的值,发现修改的是内镶属性的数据,而且这次修改后数据没有丢失,运行后也是修改后的效果.
好了,简单的讲完了.
总结下:上面刚开始到1.3为止,其实效果已经实现了,接下来都是添加元数据,添加以后给我们带来的是方便.以上解决问题的办法全是套用元数据.可能上面的元数据大家很熟悉,在MSDN里面字面解释的也很清楚,但你去试验过吗?我相信这样的试验可以让你明白的更加深刻.
这次讲的虽然很简单(难得我把这么简单的东西变的这么复杂),主要是学习学习方法了但我还是希望对大家有帮助,上面如果哪里讲错了还请指出来^_^.
ASP.NET自定义控件属性的相关内容就向你介绍到这里,希望对你了解ASP.NET自定义控件属性有所帮助。