立即登录 注册新帐号

http://www.chutianz.com - 楚天站长站

会员投稿 匿名投稿 投稿指南 RSS订阅 楚天站长站推荐:
搜索: 您的位置主页 > 网络编程 > .Net编程 > 阅读资讯:ASP.NET 2.0服务器控件开发之复杂属性

ASP.NET 2.0服务器控件开发之复杂属性

2011-10-08 17:07:36 来源:本站整理 【 】 点击:我要投稿 发表评论

 在以前中,曾经提及“复杂属性”的概念。复杂属性的最大特点是属性的类型是本身具有属性(称为子属性)的类。通常情况下,复杂属性表现为3种情势:连字符情势属性、内部嵌套情势属性和内部嵌套情势默认属性。本文将先容以上3种情势复杂属性的具体实现方法。

  1. 实现连字符情势复杂属性

  连字符情势属性是比拟常见的复杂属性。我们常用的Font属性就是一个复杂属性,其包含多个子属性,如Bold、Name等。这种类型属性具有两种语法格局:一种是利用连字符语法,在控件的开端标记中保留子属性,例如,Font-Bold,Font-Name。另外一种格局是在控件的标记中保留子属性,例如,<font Bold='true' />。后者比前者的可读性强。

  实现连字符情势的复杂属性,必需对该复杂属性及其子属性实现设置指定的设计时元数据。下面首先列举了复杂属性实现过程中的相干元数据设置示例。请浏览下面的源代码。

public class CustomerControl:WebControl{
 [ DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true) ]
 public SizeInfo Size { ...... }
}
  如上代码所示,Size是一个复杂属性,其属性类型为SizeInfo(自定义类)。在Size属性实现前设置了两个设计时元数据:DesignerSerializationVisibility和NotifyParentProperty。DesignerSerializationVisibility用于指定在设计时序列化组件上的属性时,所应用的持久性类型。其值设置为DesignerSerializationVisibility.Content枚举值,用于指定序列化程序应当序列化属性的内容即子属性,而不是Size属性本身,由于序列化Size没有任何意义。另外,还包含一个NotifyParentProperty(true)设置,它的作用是使得属性浏览器中对子属性的修正通知一直上传到对象模型,并在被修正了子属性的控件中产生修正通知。

  在完成了复杂属性的元数据设置后,开发职员还必需对子属性设置相干的设计时元数据。例如,Size包含两个子属性Height和Width,那么它们的实现代码应如下所示。

[TypeConverter(typeof(ExpandableObjectConverter))]public class SizeInfo{
 [ NotifyParentProperty(true) ]
 public UInt32 Height {......}
 [ NotifyParentProperty(true) ]
 public UInt32 Width {......}
}
  如上代码所示,子属性Height和Width分辨被设置了元数据NotifyParentProperty(true)。这样,当子属性产生修正时,.NET框架将主动产生修正通知,并且通知到父属性Size。另外,还有一个设计时特征TypeConverter(typeof(ExpandableObjectConverter)),它告诉属性浏览器供给扩大和折叠样式,这样控件开发者可以在属性浏览器中直接编纂子属性。

  以上先容了声明连字符情势属性的方法。从中可以看出,在声明连字符属性过程中需要把握两个要点:一是复杂属性的设计时元数据设置;二是子属性的设计时特征设置。  

2. 实现内部嵌套情势复杂属性

  通常情况下,开发职员多实现连字符情势的复杂属性。然而,对复杂属性还可以实现内部嵌套的情势。下面的代码就是一个典范的内部潜逃情势复杂属性的利用。

<MyControl:CustomeControl id='demo1' runat='server'>
<HeaderStyle ForeColor='#FFFF00' BackColor='#99ff00'>
</HeaderStyle>
... ...
</MyControl: CustomeControl>
  如上代码所示,自定义控件MyControl的属性HeaderStyle是一个典范的内部嵌套情势属性。实现这种情势的属性与实现连字符情势属性有很大不同,需要分为两种情况。

  假如自定义服务器控件类持续自Control类,那么必需在控件类之前设置元数据属性ParseChildren和PersistChildren。示意性代码如下所示。

[ParseChildren(true),PersistChildren(false)]
public class CustomeControl:Control{ ......}
  如上代码所示,在控件类前设置了两个元数据属性ParseChildren和PersistChildren。前者用于告诉页面分析器把控件标记中的内容解析为属性还是子控件,该属性值设置为true,则表现解析为属性。后者用于告诉设计器把控件标记中的内容保留为属性还是子控件,该属性值设置为false,表现保留为属性。

  假如自定义控件类持续自WebControl类,那么就不需要以上的元数据属性设置,由于,WebControl类已经利用了这些元数据属性了。

  无论自定义控件类持续自WebControl类还是Control类,为实现内部嵌套情势复杂属性,都必需在属性实现中设置如下元数据属性。

[ DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty)]
public TableItemStyle HeaderStyle{......}
  由上面的代码可以看到,必需在实现复杂属性之前,利用3个元数据属性:DesignerSerializationVisibility、NotifyParentProperty和PersistenceMode。前两个元数据属性在前文中已经阐明,第三个PersistenceMode用于指定如何将服务器控件属性或事件保持到ASP.NET页的元数据属性,该特征的值设置为枚举值:PersistenceMode.InnerProperty,这表现将所标识属性(HeaderStyle)保持为嵌套标记。

  以上先容了内部嵌套情势属性声明的方法。总结起来分为两种情况:一是所开发控件从Control派生,则需要设置五个设计时特征ParseChildrenAttribute(true)、PersistChildren(false)、DesignerSerializationVisibility、NotifyParentProperty和PersistenceMode。前两个特征在控件类前设置,用于告诉编译器将控件标记内的内容为属性,需要解析为属性;后三个特征在属性前指定,用于唆使编译器此属性为内部嵌套情势属性,在利用控件属性时,必需采用嵌套情势。二是所开发控件从WebControl派生,这种情况比拟简略,只需设置上文中后3个设计时特征即可。

3. 实现内部嵌套情势默认复杂属性

  内部嵌套情势默认属性与内部嵌套情势属性非常类似,它通常用于设置某个控件的聚集属性。例如,尺度服务器控件中的DataList、DropDownList控件中的属性均为内部嵌套情势默认属性。

感谢 佚名 的投稿 本文仅代表作者观点,与楚天站长站立场无关。

分享到:

共2页: 上一页12下一页

数据统计中!!

tags:之,复杂,属性,开发,控件,2.0,服务器,ASP.NET,

 责任编辑:靓哥
  • 评论总数: [ 查看全部 ] 网友评论