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