PropertyGrid 這個元件在市面上 .net 的書很少看到
這幾天摸了一下,感覺上是個還不錯用的元件
尤其對於在開發”編輯環境”的特別好用
簡單的說,這是一個可以幫你把Class變成設定介面的元件
把Class丟進元件後,元件就會幫你處理傳值與顯示值的問題
看圖或許比較好理解
有沒有一種很熟悉的感覺,沒錯,跟 Visual Studio .Net 的的屬性設定是一樣的
而這個介面只要把寫好的Class放進去就可以自動產生了,真的超方便
完整的程式碼可以到這邊下載
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
'把Class丟進去PropertyGrid
PropertyGrid1.SelectedObject = New SampleClass
End Sub
SampleClass.vb
Imports System.ComponentModel
Public Class SampleClass
<FlagsAttribute()> _
Public Enum Permissions
<Description("未設定")> _
None = 0
<Description("建立")> _
Create = 1
<Description("讀取")> _
Read = 2
<Description("更新")> _
Update = 4
<Description("刪除")> _
Delete = 8
<Description("所有功能")> _
All = Create Or Read Or Update Or Delete
End Enum
Private _P1 As String
Public Property P1_String() As String
Get
Return _P1
End Get
Set(ByVal value As String)
_P1 = value
End Set
End Property
Private _P2 As Integer
Public Property P2_Integer() As Integer
Get
Return _P2
End Get
Set(ByVal value As Integer)
_P2 = value
End Set
End Property
Private _P3 As Boolean
Public Property P3_Boolen() As Boolean
Get
Return _P3
End Get
Set(ByVal value As Boolean)
_P3 = value
End Set
End Property
Private _P4 As DateTime
Public Property P4_DateTime() As DateTime
Get
Return _P4
End Get
Set(ByVal value As DateTime)
_P4 = value
End Set
End Property
Private _P5 As Permissions
Public Property P5_Enum() As Permissions
Get
Return _P5
End Get
Set(ByVal value As Permissions)
_P5 = value
End Set
End Property
Private _P6 As New PropertyTreeClass.AddressType
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
<Description("住址")> _
Public Property P6_Tree() As PropertyTreeClass.AddressType
Get
Return _P6
End Get
Set(ByVal value As PropertyTreeClass.AddressType)
_P6 = value
End Set
End Property
Private _P7 As Color = Color.White
Public Property P7_Color() As Color
Get
Return _P7
End Get
Set(ByVal value As Color)
_P7 = value
End Set
End Property
Private _P8 As Color = System.Drawing.Color.FromArgb(123, 123, 123)
<Description("於自訂項目的下面空格中按下滑鼠右鍵,可自訂RGB")> _
Public Property P8_Color() As Color
Get
Return _P8
End Get
Set(ByVal value As Color)
_P8 = value
End Set
End Property
#Region "可分類的屬性"
Private _C1 As String
<Category("分類")> _
<Description("相同類型的屬性C1")> _
Public Property C1() As String
Get
Return _C1
End Get
Set(ByVal value As String)
_C1 = value
End Set
End Property
Private _C2 As String
<Category("分類")> _
<Description("相同類型的屬性C2")> _
Public Property C2() As String
Get
Return _C2
End Get
Set(ByVal value As String)
_C2 = value
End Set
End Property
#End Region
End Class
PropertyTreeClass.vb
Imports System.ComponentModel
Imports System.Globalization
'The namespace referenced from
'http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/f81b6caa-5fae-45c4-ad46-2240e84a5d7a
Namespace PropertyTreeClass
<TypeConverter(GetType(AddressTypeTypeConverter))> _
Public Class AddressType
Private m_country As String
<NotifyParentProperty(True), Description("國家"), RefreshProperties(RefreshProperties.Repaint)> _
Public Property Country() As String
Get
Return m_country
End Get
Set(ByVal value As String)
m_country = value
End Set
End Property
Private m_city As String
<NotifyParentProperty(True), Description("城市"), RefreshProperties(RefreshProperties.Repaint)> _
Public Property City() As String
Get
Return m_city
End Get
Set(ByVal value As String)
m_city = value
End Set
End Property
End Class
Public Class Person
Public Sub New()
homeAddressField = New AddressType()
End Sub
Private homeAddressField As AddressType
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property HomeAddress() As AddressType
Get
Return Me.homeAddressField
End Get
Set(ByVal value As AddressType)
Me.homeAddressField = value
End Set
End Property
End Class
Public Class AddressTypeTypeConverter
Inherits TypeConverter
Public Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
'This method is used to shown information in the PropertyGrid.
If destinationType Is GetType(String) Then
Return (DirectCast(value, AddressType).Country & ",") + DirectCast(value, AddressType).City
End If
Return MyBase.ConvertTo(context, culture, value, destinationType)
End Function
Public Overrides Function GetProperties(ByVal context As ITypeDescriptorContext, ByVal value As Object, ByVal attributes As Attribute()) As PropertyDescriptorCollection
Return TypeDescriptor.GetProperties(GetType(AddressType), attributes).Sort(New String() {"Country", "City"})
End Function
Public Overrides Function GetPropertiesSupported(ByVal context As ITypeDescriptorContext) As Boolean
Return True
End Function
End Class
End Namespace
