控制項學習九(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的大小,建置動作必須為“內嵌資源”。

原文地址:https://www.cnblogs.com/htht66/p/1334185.html