ASP.net自定義控件---屬性的設計時特性


.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 定義枚舉

 

  

 

  1. using System;
  2. namespace CustomComponents
  3. {
  4. /**//// summary
  5. /// 職業
  6. /// /summary
  7. publicenum Metier
  8. {
  9. 教師,程序員,作家
  10. }
  11. }

 

  1.2定義復雜屬性

 

  

 

  1. using System;
  2. using System.ComponentModel;
  3. namespace CustomComponents
  4. {
  5. /**//// summary
  6. /// 地址集合
  7. /// /summary
  8. publicclass Address
  9. {
  10. private String street = null;
  11. private String city = null;
  12. private String state = null;
  13. private String zip = null;
  14. public String Street
  15. {
  16. get
  17. {
  18. return street;
  19. }
  20. set
  21. {
  22. street = value;
  23. }
  24. }
  25. public String City
  26. {
  27. get
  28. {
  29. return city;
  30. }
  31. set
  32. {
  33. city = value;
  34. }
  35. }
  36. public String State
  37. {
  38. get
  39. {
  40. return state;
  41. }
  42. set
  43. {
  44. state = value;
  45. }
  46. }
  47. public String Zip
  48. {
  49. get
  50. {
  51. return zip;
  52. }
  53. set
  54. {
  55. zip = value;
  56. }
  57. }
  58. }
  59. }

 

  1.3 呈現控件

 

  

 

  1. using System;
  2. using System.ComponentModel;
  3. using System.Web;
  4. using System.Web.UI;
  5. namespace CustomComponents
  6. {
  7. publicclass Custom: Control
  8. {
  9. private String name = null;
  10. Address address = new Address();
  11. private Metier metier;
  12. privateint age = 0;
  13. 屬性#region 屬性
  14. [Description("年齡")]
  15. publicint Age
  16. {
  17. get
  18. {
  19. return age;
  20. }
  21. set
  22. {
  23. age = value;
  24. }
  25. }
  26. [Description("姓名")]
  27. public String Name
  28. {
  29. get
  30. {
  31. return name;
  32. }
  33. set
  34. {
  35. name = value;
  36. }
  37. }
  38. [Description("職業")]
  39. public Metier CustomMetier
  40. {
  41. get
  42. {
  43. return metier;
  44. }
  45. set
  46. {
  47. metier = value;
  48. }
  49. }
  50. [Description("地址集合")]
  51. public Address CustomAddress
  52. {
  53. get
  54. {
  55. return address;
  56. }
  57. }
  58. #endregion
  59. protectedoverridevoid Render(HtmlTextWriter output)
  60. {
  61. output.Write("姓名: " + Name + "br");
  62. output.Write("年齡: " + Age + "br");
  63. output.Write("職業: " + CustomMetier + "br");
  64. output.Write("具體地址: " + CustomAddress.Street + "br 城市: "
  65. + CustomAddress.City + "br 國籍: " +
  66. CustomAddress.State + "br 郵編: " + CustomAddress.Zip + "br");
  67. }
  68. }
  69. }

 

  1.4 在ASP.NET頁面定義控件,

 

  發現問題:屬性不是有效屬性,如下圖

 

  

 

屬性不是有效屬性

 

 

 

  打開后台代碼,輸入如下代碼檢查屬性,發現屬性是存在的,如下圖,再打開視圖,發現控件能顯示屬性,唯一的就是不能認識屬性為有效屬性,在源視圖也無法找到這幾個屬性.

 

  

 

無法找到這幾個屬性

 

 

 

  1.5 解決1.4無法顯示有效屬性的問題,(其實以上的測試已經實現復雜屬性了).

 

  解決方法:請在Custom類中的CustomAddress中加入一個元數據(元數據的解釋請參考MSDN),如下

 

  

 

  1. [Description("地址集合")]
  2. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  3. public Address CustomAddress
  4. {
  5. get
  6. {
  7. return address;
  8. }
  9. }

 

  再次打開源視圖,發現編輯器已經支持此屬性了,如下圖,這樣有點意思吧,呵呵

 

  

 

編輯器已經支持此屬性

 

 

 

  雖然源視圖上已經支持這個復雜屬性了,打開屬性面板,發現屬性面板並不支持這個復雜屬性(因為我們比較懶,不喜歡在源視圖里編輯屬性,想直接在屬性面板編輯屬性,下面就稱復雜屬性是CustomAddress),我們想要達到的效果,是讓CustomAddress屬性跟Font屬性一樣(可以折疊)顯示在面板上,如下圖

 

  

 

CustomAddress屬性顯示在面板

 

 

 

  發現問題:屬性面板並不支持這個復雜屬性

 

  1.6 實現CustomAddress屬性折疊效果

 

  解決方法:給Address類添加一個元數據,如下

 

  

 

  1. [TypeConverter(typeof(ExpandableObjectConverter))]
  2. publicclass Address
  3. {. }

 

  編譯后,再次打開屬性面板,發現CustomAddress屬性已經支持折疊效果,如下圖

 

  

 

CustomAddress屬性支持折疊效果

 

 

 

  試着在屬性面板編輯CustomAddress的子屬性,修改好子屬性以后然后運行頁面,發現子屬性修改數據后無效

 

  發現問題:在屬性面板編輯復雜屬性的子屬性無效

 

  1.7 解決屬性面板編輯復雜屬性的子屬性無效的問題

 

  解決方法:為Address類的每個屬性加上一個元數據,如下

 

  

 

  1. [NotifyParentProperty(true)]
  2. public String Street
  3. {
  4. get
  5. {
  6. return street;
  7. }
  8. set
  9. {
  10. street = value;
  11. }
  12. }

 

  編譯后,回到原asp.net的頁面,再次在屬性面板里修改子屬性,再次運行頁面.發現修改后的數據生效了.

 

  好了,以上代碼就是連字符形式的復雜屬性的實現,我們接着繼續,我們希望把CustomAddress屬性做為內鑲屬性使用,即如下代碼的形式

 

 

 

  1. custom:custom id="Custom1" runat="server" name="Clingingboy" CustomMetier="教師" Age="21"
  2. CustomAddress City="杭州" Street="不告訴你" State="中國" Zip="310000" /
  3. /custom:custom

 

  發現問題:無法使用內鑲屬性

 

  1.8 實現內鑲屬性

 

  解決方法:在Custom類中給CustomAddress再加入一個元數據(第三個),如下

 

  

 

  1. [Description("地址集合")]
  2. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
  3. [PersistenceMode(PersistenceMode.InnerProperty)]
  4. public Address CustomAddress
  5. {
  6. get
  7. {
  8. return address;
  9. }
  10. }

 

  打開源視圖(請不要把原來的連字符屬性去掉),在控件內部加入如下代碼(編輯器已經支持此屬性了)

 

  

 

  1. custom:custom
  2. CustomAddress-Zip="3100001" CustomAddress-City="杭州1"
  3. CustomAddress-State="中國1" CustomAddress-Street="不告訴你1"
  4. id="Custom1" runat="server" name="Clingingboy" CustomMetier="教師" Age="21"
  5. CustomAddress City="杭州" Street="不告訴你" State="中國" Zip="310000" /
  6. /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自定義控件屬性有所幫助。

 

 

轉自:http://blog.csdn.net/cqkxzyi/article/details/6885202


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM