`
lovnet
  • 浏览: 6671632 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

★★★【庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术系列—(4)服务器控件属性】★★★

阅读更多

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

4 庖丁解牛系列—服务器控件属性

本章内容

4.1 控件属性的作用

4.2 简单属性

4.3 属性的设计时特性

4.4 复杂属性

4.5 深入研究—定制自己的属性编辑器

4.6 类型转换器

4.7 实现自定义属性

[点击下载本书word格式完整目录介绍]

4.1 控件属性的作用

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><stroke joinstyle="miter"></stroke><path gradientshapeok="t" o:connecttype="rect"></path></shapetype>

<shape id="_x0000_s1026" style="MARGIN-TOP: 16.9pt; Z-INDEX: 251654656; LEFT: 0px; MARGIN-LEFT: 258.55pt; WIDTH: 2in; TEXT-INDENT: 0px; POSITION: absolute; HEIGHT: 230.25pt; TEXT-ALIGN: left" type="#_x0000_t202" filled="f" stroked="f"><textbox style="mso-next-textbox: #_x0000_s1026" inset="0,0,0,0"><table cellspacing="0" cellpadding="0" width="100%"><tbody><tr><td style="BORDER-RIGHT: #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent"> <div> <p class="a0" style="MARGIN: 6pt 0cm 1.2pt"><span lang="EN-US"><font size="5"><font color="#000000"><font face="宋体"><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" o:preferrelative="t"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1062" style="WIDTH: 123.75pt; HEIGHT: 204.75pt" type="#_x0000_t75"><imagedata src="file:///D:%5CDOCUME~1%5CZHENGJ~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.png" o:title=""></imagedata></shape></font></font></font></span></p> <p class="a1" style="MARGIN: 1.2pt 0cm 4.8pt"><font color="#000000"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span></font></p> </div> </td></tr></tbody></table></textbox><?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" /><wrap type="square"></wrap></shape>属性、方法和事件是控件使用者与控件交互的接口。本节主要介绍控件属性。属性分为系统属性和自定义的属性。

4-1 Webcontrol类属性窗口

4.1.1 系统属性

当开发控件时如果选择基类,比如选择继承WebControl基类,一旦继承于此类,一些默认的系统属性就会成为当前控件的属性集的一部分,图4-1所示的是WebControl类的系统属性。

可以看到一个通用Web控件所应具备的基本属性都已经有了,在实际开发控件时选择某个基类。

4.1.2 自定义属性

4.1.1节所讲的是系统已有的属性,在开发控件时一般都要为自己的控件增加一些自定义属性。自定义属性与系统属性完全一样。只是由于不具有系统属性的通用性而需要开发者自己去实现。下面看一下属性的语法格式:

string strText = "默认值";

public string Text

{

get

{

return strText;

}

set

{

strText = value;

}

}

以上是一个最简单的属性,由一个setget语段组成。注意,setget段不是必需的,比如可以去掉set段表示此属性只允许读取而不允许接收值。

事实上属性的特性范畴还比较多,如简单属性、复杂属性,以及属性在设计时的特性和标记形式的格式等,下面将对这些特性一一进行介绍。

4.2 简单属性

简单属性是类型为字符串的或容易转换为字符串的属性。简单属性在控件的开始标记上自行保留为属性。.NET Framework 类库中的基元值类型,如StringBooleanInt16Int32DateTimeByteCharDoubleEnum均为简单属性。可以通过添加代码将简单属性存储在ViewState字典中,以便在回发间进行状态管理。请看例子:

/// <summary>

/// 获得本书更多内容,请看:

/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx

/// </summary>

public string Value

{

get

{

String s = (String)ViewState["Value"];

return ((s == null) ? String.Empty : s);

}

set

{

ViewState["Value"] = value;

}

}

上面声明的简单属性中,属性可接收及其返回值的类型是String,表示本属性为简单属性。另外,简单属性可以直接使用ViewState存储其值,因为简单属性可以直接映射为字符串,而ViewState中可以直接接收的格式也是字符串。

ViewState是页面视图状态机制中的存储机制,是为解决在Web浏览器两次访问之间无状态保持而提供的一种机制,视图信息存储在网页中专用HiddenField区域,而且每次页面提交都会往返于客户端和服务器,因此一般视图主要用于存储少量的文本数据信息,而不适合存储数据量比较大的业务数据。另外,复杂属性的存储也要自己实现视图机制功能,这一点在后面讨论视图机制的章节会详细介绍,这里仅作了解即可。

只要控件中定义了上面的代码段,对应在页面设计器属性窗口中就会包含此项,如图4-2所示。

<shape id="_x0000_i1025" style="WIDTH: 164.25pt; HEIGHT: 26.25pt; flip: y" type="#_x0000_t75"><imagedata src="file:///D:%5CDOCUME~1%5CZHENGJ~1%5CLOCALS~1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image003.png" o:title=""><font color="#000000" size="2"></font></imagedata></shape>

4-2 属性窗口中的属性

在属性窗口中输入一些文本,打开设计器中的源代码会看到如下标记的ASP.NET代码:

<cc1:controlproperty id="ControlProperty1" runat="server" Value="简单属性">

</cc1:controlproperty>

同样,BooleanInt16Int32DateTimeByteCharDoubleEnum等类型的属性与上面的String类型属性代码标记完全一样。简单属性比较简单,就讲解到这里。

4.3 属性的设计时特性

.NET Framework为控件设计时属性提供了很多丰富的类,这些属性的功能非常灵活,控制范围广泛,比如可以控制该属性在属性窗口中的显示模式,如:是否在属性窗口中显示该属性,也可以指定此属性必须接收值类型描述,按组分类等,也可以控制文本的标记呈现格式等,甚至可以自己定义一个属性类,实现自己想实现的功能。下面讲一下常用的.NET Framework的属性类对控件的支持功能。

Ø Bindable

指定属性是否可以绑定一个有效数据源,通常使用布尔值进行设置。例如:Bindable(true)。如果使用值true标记属性,表示该属性可以绑定一个有效数据源

Ø Browsable

指定属性是否应该在属性窗口中显示,使用布尔值设置。一般情况下,对于常用的和比较重要的属性设置Browsabletrue,否则设置Browsablefalse

Ø 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种枚举设置方式:

— PersistenceModePersistenceMode.Attribute)指定属性或事件保持为属性;

— PersistenceModePersistenceMode.EncodedInnerDefaultProperty)指定属性作为服务器控件的唯一内部文本,如果属性值是HTML编码的,只能对字符串作这种指定;

— PersistenceModePersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保持为内部文本,还指示将该属性定义为元素的默认属性,只能指定一个属性为默认属性;

— PersistenceModePersistenceMode.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

设计时特性,指定与控件关联的设计器类。控件设计器类用于控制关联的控件在可视化设计器的设计图面上的外观和行为。

还有一些更复杂的,包括在设计模式下的元数据属性类在这里没有列出,因为在后面有专门的章节详细介绍,通过代码示例更容易理解。在这里只要理解上面这些属性类功能,开发一般的控件是没有问题了。

4.4 复杂属性

4.4.1 概述

复杂属性是属性的类型不是简单值类型,或者是一个包含其他属性的类。例如.NET Framework中的StyleFontPoint等都是复杂属性。另外还有集合属性,这里也将它作为复杂属性归类,对于集合属性在本章后面会单独拿出来一节进行详细讲解。

4.4.2 复杂属性的几种标记形式

先看看一个典型的代码段:

<asp:GridView ID="GridView1" runat="server">

<FooterStyle BackColor="#507CD1" Font-Bold="true" ForeColor="White" />

<RowStyle BackColor="#EFF3FB" />

<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign= "Center" />

<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="true" ForeColor= "#333333" />

<HeaderStyle BackColor="#507CD1" Font-Bold="true" ForeColor="White" />

<EditRowStyle BackColor="#2461BF" />

<AlternatingRowStyle BackColor="White" />

</asp:GridView>

<asp:ListBox ID="ListBox1" runat="server">

<asp:ListItem Value="1"></asp:ListItem>

<asp:ListItem Value="0"></asp:ListItem>

</asp:ListBox>

代码非常简单,一段是GridView控件的一些属性,另一段是ListBox控件的一些属性。仔细观察一下这些控件的属性标记,我们能很容易给它们归类,比如:GridViewID/Runat属性标记类型相似,FootStyle/RowStyle这样的标记类似,还有Font-Bold这样的属性标记,ListBox的集合项ListItem标记也比较特殊等这么多标记类型。我们在开发控件时当然也希望能够生成这么多灵活的标记类型,那么本节就详细介绍一下服务端控件的这些标记类型是怎样生成的。

开始之前,有必要说明一下,下面所有代码示例在调试时都是在设计模式下进行的。关于在设计模式下如何调试代码在第2章已经详细讲解过了,如果读者还有疑问请再回顾一下第2章的内容。

通常情况下,复杂属性表现为几种形式:连字符形

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics