天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

ASP.NET 2.0服務(wù)器控件開發(fā)之復(fù)雜屬性

在上一篇文章中,曾經(jīng)提及“復(fù)雜屬性”的概念。復(fù)雜屬性的最大特征是屬性的類型是本身具有屬性(稱為子屬性)的類。通常情況下,復(fù)雜屬性表現(xiàn)為3種形式:連字符形式屬性、內(nèi)部嵌套形式屬性和內(nèi)部嵌套形式默認屬性。本文將介紹以上3種形式復(fù)雜屬性的具體實現(xiàn)方法。

  1. 實現(xiàn)連字符形式復(fù)雜屬性

  連字符形式屬性是比較常見的復(fù)雜屬性。我們常用的Font屬性就是一個復(fù)雜屬性,其包括多個子屬性,如Bold、Name等。這種類型屬性具有兩種語法格式:一種是利用連字符語法,在控件的開始標記中保存子屬性,例如,F(xiàn)ont-Bold,F(xiàn)ont-Name。另外一種格式是在控件的標記中保存子屬性,例如,<font Bold="true" />。后者比前者的可讀性強。

  實現(xiàn)連字符形式的復(fù)雜屬性,必須對該復(fù)雜屬性及其子屬性實現(xiàn)設(shè)置指定的設(shè)計時元數(shù)據(jù)。下面首先列舉了復(fù)雜屬性實現(xiàn)過程中的相關(guān)元數(shù)據(jù)設(shè)置示例。請閱讀下面的源代碼。

 

public class CustomerControl:WebControl{
 [ DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true) ]
 public SizeInfo Size { ...... }
}
  如上代碼所示,Size是一個復(fù)雜屬性,其屬性類型為SizeInfo(自定義類)。在Size屬性實現(xiàn)前設(shè)置了兩個設(shè)計時元數(shù)據(jù):DesignerSerializationVisibility和NotifyParentProperty。DesignerSerializationVisibility用于指定在設(shè)計時序列化組件上的屬性時,所使用的持久性類型。其值設(shè)置為DesignerSerializationVisibility.Content枚舉值,用于指定序列化程序應(yīng)該序列化屬性的內(nèi)容即子屬性,而不是Size屬性本身,因為序列化Size沒有任何意義。另外,還包括一個NotifyParentProperty(true)設(shè)置,它的作用是使得屬性瀏覽器中對子屬性的修改通知一直上傳到對象模型,并在被修改了子屬性的控件中產(chǎn)生修改通知。

  在完成了復(fù)雜屬性的元數(shù)據(jù)設(shè)置后,開發(fā)人員還必須對子屬性設(shè)置相關(guān)的設(shè)計時元數(shù)據(jù)。例如,Size包括兩個子屬性Height和Width,那么它們的實現(xiàn)代碼應(yīng)如下所示。

[TypeConverter(typeof(ExpandableObjectConverter))]public class SizeInfo{
 [ NotifyParentProperty(true) ]
 public UInt32 Height {......}
 [ NotifyParentProperty(true) ]
 public UInt32 Width {......}
}
  如上代碼所示,子屬性Height和Width分別被設(shè)置了元數(shù)據(jù)NotifyParentProperty(true)。這樣,當子屬性發(fā)生修改時,.NET框架將自動產(chǎn)生修改通知,并且通知到父屬性Size。另外,還有一個設(shè)計時特性TypeConverter(typeof(ExpandableObjectConverter)),它告訴屬性瀏覽器提供擴展和折疊樣式,這樣控件開發(fā)者可以在屬性瀏覽器中直接編輯子屬性。

  以上介紹了聲明連字符形式屬性的方法。從中可以看出,在聲明連字符屬性過程中需要把握兩個要點:一是復(fù)雜屬性的設(shè)計時元數(shù)據(jù)設(shè)置;二是子屬性的設(shè)計時特性設(shè)置。

  2. 實現(xiàn)內(nèi)部嵌套形式復(fù)雜屬性

  通常情況下,開發(fā)人員多實現(xiàn)連字符形式的復(fù)雜屬性。然而,對復(fù)雜屬性還可以實現(xiàn)內(nèi)部嵌套的形式。下面的代碼就是一個典型的內(nèi)部潛逃形式復(fù)雜屬性的應(yīng)用

 

<MyControl:CustomeControl id="demo1" runat="server">
<HeaderStyle ForeColor="#FFFF00" BackColor="#99ff00">
</HeaderStyle>
... ...
</MyControl: CustomeControl>
  如上代碼所示,自定義控件MyControl的屬性HeaderStyle是一個典型的內(nèi)部嵌套形式屬性。實現(xiàn)這種形式的屬性與實現(xiàn)連字符形式屬性有很大不同,需要分為兩種情況。

  如果自定義服務(wù)器控件類繼承自Control類,那么必須在控件類之前設(shè)置元數(shù)據(jù)屬性ParseChildren和PersistChildren。示意性代碼如下所示。

[ParseChildren(true),PersistChildren(false)]
public class CustomeControl:Control{ ......}
  如上代碼所示,在控件類前設(shè)置了兩個元數(shù)據(jù)屬性ParseChildren和PersistChildren。前者用于告知頁面分析器把控件標記中的內(nèi)容解析為屬性還是子控件,該屬性值設(shè)置為true,則表示解析為屬性。后者用于告知設(shè)計器把控件標記中的內(nèi)容保存為屬性還是子控件,該屬性值設(shè)置為false,表示保存為屬性。

  如果自定義控件類繼承自WebControl類,那么就不需要以上的元數(shù)據(jù)屬性設(shè)置,因為,WebControl類已經(jīng)應(yīng)用了這些元數(shù)據(jù)屬性了。

  無論自定義控件類繼承自WebControl類還是Control類,為實現(xiàn)內(nèi)部嵌套形式復(fù)雜屬性,都必須在屬性實現(xiàn)中設(shè)置如下元數(shù)據(jù)屬性。

[ DesignerSerializationVisibility( DesignerSerializationVisibility.Content), NotifyParentProperty(true), PersistenceMode(PersistenceMode.InnerProperty)]
public TableItemStyle HeaderStyle{......}
  由上面的代碼可以看到,必須在實現(xiàn)復(fù)雜屬性之前,應(yīng)用3個元數(shù)據(jù)屬性:DesignerSerializationVisibility、NotifyParentProperty和PersistenceMode。前兩個元數(shù)據(jù)屬性在前文中已經(jīng)說明,第三個PersistenceMode用于指定如何將服務(wù)器控件屬性或事件保持到ASP.NET頁的元數(shù)據(jù)屬性,該特性的值設(shè)置為枚舉值:PersistenceMode.InnerProperty,這表示將所標識屬性(HeaderStyle)保持為嵌套標記。

  以上介紹了內(nèi)部嵌套形式屬性聲明的方法。總結(jié)起來分為兩種情況:一是所開發(fā)控件從Control派生,則需要設(shè)置五個設(shè)計時特性ParseChildrenAttribute(true)、PersistChildren(false)、DesignerSerializationVisibility、NotifyParentProperty和PersistenceMode。前兩個特性在控件類前設(shè)置,用于告訴編譯器將控件標記內(nèi)的內(nèi)容為屬性,需要解析為屬性;后三個特性在屬性前指定,用于指示編譯器此屬性為內(nèi)部嵌套形式屬性,在應(yīng)用控件屬性時,必須采用嵌套形式。二是所開發(fā)控件從WebControl派生,這種情況比較簡單,只需設(shè)置上文中后3個設(shè)計時特性即可。

  3. 實現(xiàn)內(nèi)部嵌套形式默認復(fù)雜屬性

  內(nèi)部嵌套形式默認屬性與內(nèi)部嵌套形式屬性非常類似,它通常用于設(shè)置某個控件的集合屬性。例如,標準服務(wù)器控件中的DataList、DropDownList控件中的屬性均為內(nèi)部嵌套形式默認屬性。

  為了實現(xiàn)這種形式的屬性,主要需設(shè)置兩個元數(shù)據(jù)屬性:一是在控件類前設(shè)置ParseChildren(true, "DefaultPropertyName"),指定該控件中嵌套的標記表示屬性,而非子控件,同時將嵌套屬性分析為該控件的集合屬性;二是在集合屬性前設(shè)置特性PersistenceMode(PersistenceMode.InnerDefaultProperty),表示將該屬性定義為控件的默認屬性。

  4. 小結(jié)

  本文介紹了創(chuàng)建復(fù)雜屬性的實現(xiàn)方法。這是實現(xiàn)自定義服務(wù)器控件過程中的重點和難點內(nèi)容。在隨后的一篇文章中,我們將通過示例來加深對復(fù)雜屬性實現(xiàn)方法的認識。

 

AspNet技術(shù)ASP.NET 2.0服務(wù)器控件開發(fā)之復(fù)雜屬性,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: YELLOW视频在线观看免费版高清 | 久草在线在线精品观看99 | 亚洲免费精品视频 | 翁公与小莹在客厅激情 | 女攻男受高h全文肉肉 | 一二三四在线观看高清电视剧 | 免费人成在线观看网站视频 | 日产国产欧美韩国在线 | 国产伊人久久 | 武侠艳妇屈辱的张开双腿 | 91嫩草国产在线观看免费 | 啦啦啦视频在线观看WWW | 男人女人边摸边吃奶边做 | 在线播放无码字幕亚洲 | XXX国产麻豆HD | 好吊日视频在线 | 黄色免费网址在线观看 | 四虎国产精品永久一区高清 | 成年黄网站免费大全毛片 | 欧洲-级毛片内射八十老太婆 | 99久热这里精品免费 | 欧美双拳极限扩张 | 旧里番YY6080在线播放 | 亚洲精品无码不卡在线播HE | 强被迫伦姧惨叫VIDEO | 第一次处破女完整版电影 | 国产日韩欧美高清免费视频 | 欧美日韩在线成人看片a | 迅雷哥在线观看高清 | 青草久久精品亚洲综合专区 | 亚洲区视频在线观看 | 亚洲在线2018最新无码 | 中文字幕人成人乱码亚洲影视 | 午夜快车神马影视 | 恋夜影院安卓免费列表uc | 一区二区三区四区国产 | 亚洲区欧美日韩综合 | 91热久久免费频精品99欧美 | 国语自产一区第二页 | 免费看大黄高清网站视频在线 | 精品久久伦理中文字幕 |