撰寫伺服器控制項的集合屬性 (CollectionBase)
在伺服器控制項中常會使用到集合屬性,例如 ListBox.Items 屬性或 DropDownList.Items 屬性;若自訂的伺服器控制項也要加入集合屬性的話,最方便的方式就是繼承 CollectionBase 來撰寫集合類別,因為 CollectionBase 類別可序列化且支援設計階段的集合編輯器。
以下就來實作一個集合屬性的範例,我們要建立一個 TListItemCollection 集合類別,集合中包含 TListItem 成員類別。TListItem 類別中包含了 Text 及 Value 屬性,其中注意一點是要使用 <System.Serializable()> 將 TListItem 類別標記為可序列化。
再是繼承 CollectionBase 來撰寫 TListItemCollection 集合類別,覆寫 Item 屬性傳回 TListItem 型別,再加入 Add、Insert、Remove 等集合的操作方法。同樣地,也是用 <System.Serializable()> 將 TListItemCollection 集合類別標記為可序列化。
接下來我們要將 TListItemCollection 集合類別使用到控制項的集合屬性,撰寫一個測試的伺服器控制項,加入 TListItemCollection 型別的 Items 屬性。
控制項使用設計階段屬性 PersistenceMode 及 DesignerSerializationVisibility 設定屬性序列化後在 aspx 程式碼中的儲存方式。
System.Web.UI.PersistenceMode(PersistenceMode.InnerProperty)
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)
使用 Editor 設計階段屬性,來設定該屬性的設計階段編輯器。
Editor(GetType(System.ComponentModel.Design.CollectionEditor), GetType(System.Drawing.Design.UITypeEditor))
完成這個集合屬性後,就將其拖曳到頁面上在屬性視窗設定 Items 屬性時,就會出現如下的集合編輯器。
再來切換到 aspx 程式碼,去看一下屬性序列化的結果。
範例程式下載:http://uploadingit.com/files/353947_3ygao/CollectionBase.zip