控制項學習九(AttributeCollection及工具箱圖示)
十一.屬性設計的進階技巧
1.當屬性是指向某個集合或物件
當我們使用某些控制項的時候,屬性似乎不是屬性,而是一個另外一個物件。看下面的例子。
我們在頁面上布置一個TextBox,你會發現可以這樣用”me.TextBox1.Attributes.Add()”
其實,Attributes是它的一個屬性。單純的屬性是不會有方法和其他屬性的,很顯然,Attributes是指向另外一個結構——AttributeCollection物件。
Imports System.ComponentModel
Imports System.Web.UI
<DefaultProperty("items"), ToolboxData("<{0}:MyTestControlA runat=server></{0}:MyTestControlA>")> Public Class MyTestControlA
Inherits System.Web.UI.WebControls.WebControl
'儲存一個項目的類別
Class DataItem
Public data1 As String
Sub New(ByVal data)
data1 = data
End Sub
End Class
'定義項目集合的類別(給屬性用)
Class DataItems
Inherits CollectionBase
Default Public Property item(ByVal index As Integer) As DataItem
Get
Return CType(List(index), DataItem)
End Get
Set(ByVal Value As DataItem)
List(index) = Value
End Set
End Property
Public Sub Remove(ByVal value As DataItem)
List.Remove(value)
End Sub 'Remove
Public Function Add(ByVal value As DataItem)
Return List.Add(value)
End Function 'Add
End Class
'DataItems
Dim _items As New DataItems
'指向 DataItems 的屬性
<Bindable(True), Category("Appearance"), DefaultValue("")> Property items() As DataItems
Get
Return _items
End Get
Set(ByVal Value As DataItems)
_items = Value
End Set
End Property
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
output.RenderBeginTag("div")
output.Write("<br>MyTestControls<br>")
If Not (items Is Nothing) Then
'顯示 items 屬性中的每一個元素
For Each i As DataItem In Me.items()
output.Write("<br>" & i.data1)
Next
End If
output.RenderEndTag()
End Sub
End Class
.NET Framework為了處理這種十分常用的需求,設計了CollectionBase,作為抽象的基底類別(Base Class)。
3.指向陣列(集合)的預設屬性
我們曾經提過,控制項的事件有預設事件,控制項的屬性也有預設屬性,要將屬性設為屬性相當簡單,只需要在宣告屬性的時候加上【Default】關鍵字即可,唯一一個條件,是該屬性必須有傳入值。例如:
Default Public Property item(ByVal index As Integer) As DataItem
Get
Return CType(List(index), DataItem)
End Get
Set(ByVal Value As DataItem)
List(index) = Value
End Set
End Property
之後,我們就可以這樣用Me.MyTestControlA1.items.item(0).data1=”abc”
十二.控制項的工具箱圖示
當我們建置控制項的時候,請加入一個“同名的”.bmp圖檔,這個圖檔是16X16的大小,建置動作必須為“內嵌資源”。