CollectionEditor 顯示 [說明] 區域

CollectionEditor 顯示 [說明] 區域

摘要

CollectionEditor 是最基本的集合屬性編輯器,如 ListBox 的 Items 屬性編輯器(ListItemsCollectionEditor)即為繼承 CollectionEditor 而來。如圖1所示,為 ListBox 的 Items 屬性編輯器,編輯視窗右邊的屬性視窗預設是沒有顯示 [說明] 區域的。如果我們要讓它如圖2所示的 GridView 的 Columns 屬性編輯器,在屬性視窗下方一樣具有 [說明] 區域,要如何處理呢?本文將以 ListBox 的 Items 屬性編輯器為例,說明如何讓 CollectionEditor 的屬性視窗一樣可以顯示 [說明] 區域。

image

圖1. ListBox 的 Items 屬性編輯器

 

image

圖2. GridView 的 Columns 屬性編輯器

 

改寫集合屬性編輯器

我們要改寫 ListBox 的 Items 屬性編輯器,故繼承 ListItemsCollectionEditor 下來命名為 TBListItemsCollectionEditor。主要作法是覆寫 CreateCollectionForm 方法,找到編輯視窗中的屬性編輯器控制項(System.Windows.Forms.PropertyGrid),並設定 PropertyGrid.HelpVisible = True 即可。


Imports System.Drawing.Design
Imports System.Windows.Forms.Design
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Reflection
Imports System.Web.UI.Design.WebControls

Namespace WebControls.Design
    Public Class TBListItemsCollectionEditor
        Inherits ListItemsCollectionEditor

        Public Sub New(ByVal newType As Type)
            MyBase.new(newType)
        End Sub

        ''' <summary>
        ''' 覆寫。建立集合屬性編輯器表單。
        ''' </summary>
        Protected Overrides Function CreateCollectionForm() As System.ComponentModel.Design.CollectionEditor.CollectionForm
            Dim oForm As CollectionEditor.CollectionForm
            Dim oType As Type
            Dim oFieldInfo As FieldInfo
            Dim oPropertyGrid As System.Windows.Forms.PropertyGrid

            oForm = MyBase.CreateCollectionForm()
            oType = oForm.GetType()
            oFieldInfo = oType.GetField("propertyBrowser", BindingFlags.NonPublic Or BindingFlags.Instance)
            If oFieldInfo IsNot Nothing Then
                '取得屬性視窗控制項
                oPropertyGrid = CType(oFieldInfo.GetValue(oForm), System.Windows.Forms.PropertyGrid)
                '設定屬性視窗控制項的[說明]區域為可視
                oPropertyGrid.HelpVisible = True
            End If
            Return oForm
        End Function

    End Class
End Namespace

套用 TBListItemsCollectionEditor 屬性編輯器

首先繼承 ListBox 下來命名為 TBListBox,再覆寫 Items 屬性,使用 Editor 重新定義該屬性編輯器為 TBListItemsCollectionEditor。


Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports Bee.Web.WebControls.Design

Namespace WebControls
    < _
    Description("清單控制項"), _
    ToolboxData("<{0}:TBListBox runat=server></{0}:TBListBox>") _
    > _
    Public Class TBListBox
        Inherits ListBox

        <Editor(GetType(TBListItemsCollectionEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Overrides ReadOnly Property Items() As ListItemCollection
            Get
                Return MyBase.Items
            End Get
        End Property

    End Class
End Namespace

測試結果

在頁面上放置設計完成的 TBListBox 控制項,在屬性視窗中編輯 Items 屬性,就可以看到我們重新定義的 TBListItemsCollectionEditor 編輯器出現 [說明] 區域。

image

image

ASP.NET 魔法學院