web控件开发系列(四) 自定义控件属性(下)

控件在WEB开发时经常要用到,虽然有部分已经存在工具箱里,但有时总需要根据自己的要求,开发一些合适自己的控件。接上一节,已经说过了控件的属性, 例如,我们需要一组属性的集合时,这时我们需要用到的就是复杂属性了,简单的属性满足不了我们的要求,例如:大家熟悉的字体信息设置那栏。下面为大家介绍一下实现的几种代码与注意细节

一、连字符形式的复杂属性标记
<asp:Button ID="Button1" runat="server" Font-Bold="True" Font-Italic="True" Font-Names="Arial" Font-Overline="True" Font-Size="20pt" Text="Button" />
例如上面就是一个Font的复杂属性,通过这个属性可以设置一系列相关的值。
在ServerControl中添加一个类ComplexAttribute,然后输入下面代码:

Code

注意细节,不然你会感觉到很多地方不明白:
1、Student类,在设计时最好封装起来,添加密封限制,让这个类无法继承。
2、Student类的属性添加特性[NotifyParentProperty(true)]
3、构造函数ComplexAttribute时初始化Student类,不然设计器中你的控件会出现未引用对象的错误提示。
4、ComplexAttribute类的属性添加特性[PersistenceMode(PersistenceMode.Attribute)]   //指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性
5、ComplexAttribute类的属性添加特性[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  //指定属性是否以及如何在代码中序列化
6、ComplexAttribute类的属性添加特性[TypeConverter(typeof(ExpandableObjectConverter))]  //指定用作此特性所绑定到的对象的转换器的类型
7、ComplexAttribute类的属性添加特性[NotifyParentProperty(true)]

PersistenceMode详解:
指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性,共存在4种枚举设置方式:
1、PersistenceMode(PersistenceMode.Attribute)指定属性或事件保持为属性;
2、PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)指定属性作为服务器控件的唯一内部文本,如果属性值是HTML编码的,只能对字符串作这种指定;
3、PersistenceMode(PersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保持为内部文本,还指示将该属性定义为元素的默认属性,只能指定一个属性为默认属性;
4、PersistenceMode(PersistenceMode.InnerProperty)指定属性在服务器控件中保持为嵌套标记,通常用于复杂对象,它们具有自己的持久性属性。
DesignerSerializationVisibility详解:
指定属性是否以及如何在代码中序列化,其值为DesignerSerializationVisibility的枚举值,存在3种设置方式:
1、DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不应该序列化属性值;
2、DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列化程序序列化属性的值;
3、DesignerSerializationVisibility(DesignerSerializationVisibility.Content)指定序列化程序应该序列化属性的内容,而不是属性本身。此字段为只读。Visible为其默认值。

编译,在页面上拖进控件,再看一下属性窗口,你自己定义的属性就在里面了,如下图:


设置Student属性,到页面代码视图,就会出现下面的代码:
 <cc1:ComplexAttribute ID="ComplexAttribute1" runat="server" Student-Age="10" Student-Cost="95" Student-Name="ASP.NET" />

二、内部嵌套复杂属性标记

<asp:GridView ID="GridView1" runat="server">
    <RowStyle BackColor="#EFF3FB" />
</asp:GridView>
例如上面的代码,BackColor属性RowStyle是内部嵌套。
在ServerControl中添加一个类InRowAttribute然后输入下面代码:

Code

编译后在设计器中拖进这个控件,在属性窗口设置值,在代码视图中可以看到下面的代码
<cc1:InRowAttribute ID="InRowAttribute1" runat="server">
    <BackColorStyle BackColor="ActiveBorder"></BackColorStyle>
</cc1:InRowAttribute>

属性定定义方面还有好多类型,例如我们常用的ListItem组合, CheckBox组合, 或自己需要时定义的边框线条,边框大小,颜色等等,这些都是大家在开发中慢慢摸索(举一反百)吧,如果大家有好的控件,不防也与我分享一下。

原文地址:https://www.cnblogs.com/whtydn/p/1566818.html