2009-06-08 67 views
3

我在Windows應用程序項目中有一個UserControl類。它的一個屬性是我定義的另一個類的集合。我似乎無法找到一個在設計時如何讓標準集合編輯器爲它工作的好例子。設計時用戶控件中的集合編輯器

我得到它使用一些示例代碼,我發現程度,但我的集合中的數據不會被保存。當我退出表單並在設計時將其打開時,數據不再存在。

這裏是我的類:

Public Class Gauge 
Inherits Control 

Private WithEvents _Captions As New CaptionCollection 

<Category("Gauge"), _ 
TypeConverter(GetType(CaptionCollectionConverter)), _ 
Description("Custom text displayed on the gauge.")> _ 
Public Property Captions() As CaptionCollection 
    Get 
     Return _Captions 
    End Get 
    Set(ByVal value As CaptionCollection) 
     _Captions = value 
    End Set 
End Property 

<Category("Gauge"), _ 
TypeConverter(GetType(CaptionConverter)), _ 
Description("Custom text displayed on the gauge.")> _ 
Public Class Caption 
    Private _Text As String = "" 
    Private _Color As Color = Color.Black 
    Private _TextIsValue As Boolean 
    Private _Position As New Point(0, 0) 

    Public Property Text() As String 
     Get 
      Return _Text 
     End Get 
     Set(ByVal value As String) 
      If _Text <> value Then 
       _Text = value 
      End If 
     End Set 
    End Property 

    Public Property Color() As Color 
     Get 
      Return _Color 
     End Get 
     Set(ByVal value As Color) 
      If _Color <> value Then 
       _Color = value 
      End If 
     End Set 
    End Property 

    Public Property TextIsValue() As Boolean 
     Get 
      Return _TextIsValue 
     End Get 
     Set(ByVal value As Boolean) 
      If _TextIsValue <> value Then 
       _TextIsValue = value 
      End If 
     End Set 
    End Property 

    Public Property Position() As Point 
     Get 
      Return _Position 
     End Get 
     Set(ByVal value As Point) 
      If _Position <> value Then 
       _Position = value 
      End If 
     End Set 
    End Property 
End Class 

Public Class CaptionCollection 
    Inherits CollectionBase 
    Implements ICustomTypeDescriptor 

    Public Sub Add(ByVal c As Caption) 
     Me.List.Add(c) 
    End Sub 

    Public Sub Remove(ByVal c As Caption) 
     Me.List.Remove(c) 
    End Sub 

    Default Public ReadOnly Property Item(ByVal index As Integer) As Caption 
     Get 
      Return DirectCast(Me.List(index), Caption) 
     End Get 
    End Property 

    ' Implementation of interface ICustomTypeDescriptor 
    Public Function GetClassName() As String Implements System.ComponentModel.ICustomTypeDescriptor.GetClassName 
     Return TypeDescriptor.GetClassName(Me, True) 
    End Function 

    Public Function GetAttributes() As AttributeCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetAttributes 
     Return TypeDescriptor.GetAttributes(Me, True) 
    End Function 

    Public Function GetComponentName() As String Implements System.ComponentModel.ICustomTypeDescriptor.GetComponentName 
     Return TypeDescriptor.GetComponentName(Me, True) 
    End Function 

    Public Function GetConverter() As TypeConverter Implements System.ComponentModel.ICustomTypeDescriptor.GetConverter 
     Return TypeDescriptor.GetConverter(Me, True) 
    End Function 

    Public Function GetDefaultEvent() As EventDescriptor Implements System.ComponentModel.ICustomTypeDescriptor.GetDefaultEvent 
     Return TypeDescriptor.GetDefaultEvent(Me, True) 
    End Function 

    Public Function GetDefaultProperty() As PropertyDescriptor Implements System.ComponentModel.ICustomTypeDescriptor.GetDefaultProperty 
     Return TypeDescriptor.GetDefaultProperty(Me, True) 
    End Function 

    Public Function GetEditor(ByVal editorBaseType As Type) As Object Implements System.ComponentModel.ICustomTypeDescriptor.GetEditor 
     Return TypeDescriptor.GetEditor(Me, editorBaseType, True) 
    End Function 

    Public Function GetEvents(ByVal attributes As Attribute()) As EventDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetEvents 
     Return TypeDescriptor.GetEvents(Me, attributes, True) 
    End Function 

    Public Function GetEvents() As EventDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetEvents 
     Return TypeDescriptor.GetEvents(Me, True) 
    End Function 

    Public Function GetPropertyOwner(ByVal pd As PropertyDescriptor) As Object Implements System.ComponentModel.ICustomTypeDescriptor.GetPropertyOwner 
     Return Me 
    End Function 

    Public Function GetProperties(ByVal attributes As Attribute()) As PropertyDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetProperties 
     Return GetProperties() 
    End Function 

    Public Function GetProperties() As PropertyDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetProperties 
     ' Create a collection object to hold property descriptors 
     Dim pds As New PropertyDescriptorCollection(Nothing) 

     ' Iterate the list of employees 
     For i As Integer = 0 To Me.List.Count - 1 
      ' Create a property descriptor for the caption item and add to the property descriptor collection 
      Dim pd As New CaptionCollectionPropertyDescriptor(Me, i) 
      pds.Add(pd) 
     Next 
     ' return the property descriptor collection 
     Return pds 
    End Function 
End Class 

' This is a special type converter which will be associated with the Caption class. 
' It converts a Caption object to string representation for use in a property grid. 
Friend Class CaptionConverter 
    Inherits ExpandableObjectConverter 

    Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destType As Type) As Object 
     'Return "(Collection)" 
     If destType Is GetType(String) AndAlso TypeOf value Is Caption Then 
      ' Cast the value to an Caption type 
      Dim emp As Caption = DirectCast(value, Caption) 
      ' Return the text for display. 
      Return emp.Text 
     End If 
     Return MyBase.ConvertTo(context, culture, value, destType) 
    End Function 
End Class 

' This is a special type converter which will be associated with the CaptionCollection class. 
' It converts a CaptionCollection object to a string representation for use in a property grid. 
Friend Class CaptionCollectionConverter 
    Inherits ExpandableObjectConverter 

    Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destType As Type) As Object 
     If destType Is GetType(String) AndAlso TypeOf value Is CaptionCollection Then 
      ' Return department and department role separated by comma. 
      Return "(Collection)" 
     End If 
     Return MyBase.ConvertTo(context, culture, value, destType) 
    End Function 
End Class 

Public Class CaptionCollectionPropertyDescriptor 
    Inherits PropertyDescriptor 
    Private collection As CaptionCollection = Nothing 
    Private index As Integer = -1 

    Public Sub New(ByVal coll As CaptionCollection, ByVal idx As Integer) 
     MyBase.New("#" & idx.ToString(), Nothing) 
     Me.collection = coll 
     Me.index = idx 
    End Sub 

    Public Overloads Overrides ReadOnly Property Attributes() As AttributeCollection 
     Get 
      Return New AttributeCollection(Nothing) 
     End Get 
    End Property 

    Public Overloads Overrides Function CanResetValue(ByVal component As Object) As Boolean 
     Return True 
    End Function 

    Public Overloads Overrides ReadOnly Property ComponentType() As Type 
     Get 
      Return Me.collection.[GetType]() 
     End Get 
    End Property 

    Public Overloads Overrides ReadOnly Property DisplayName() As String 
     Get 
      Return "Caption" + (index + 1).ToString() 
     End Get 
    End Property 

    Public Overloads Overrides ReadOnly Property Description() As String 
     Get 
      Return "Caption" + (index + 1).ToString() 
     End Get 
    End Property 

    Public Overloads Overrides Function GetValue(ByVal component As Object) As Object 
     Return Me.collection(index) 
    End Function 

    Public Overloads Overrides ReadOnly Property IsReadOnly() As Boolean 
     Get 
      Return False 
     End Get 
    End Property 

    Public Overloads Overrides ReadOnly Property Name() As String 
     Get 
      Return "#" & index.ToString() 
     End Get 
    End Property 

    Public Overloads Overrides ReadOnly Property PropertyType() As Type 
     Get 
      Return Me.collection(index).[GetType]() 
     End Get 
    End Property 

    Public Overloads Overrides Sub ResetValue(ByVal component As Object) 
    End Sub 

    Public Overloads Overrides Function ShouldSerializeValue(ByVal component As Object) As Boolean 
     Return True 
    End Function 

    Public Overloads Overrides Sub SetValue(ByVal component As Object, ByVal value As Object) 
     ' this.collection[index] = value; 
    End Sub 
End Class 

末級

+0

你的集合是什麼樣子的?大多數時候,系統會自動選擇它... – 2009-06-08 13:34:58

+0

我發佈了我的代碼, m只是試圖讓一個簡單的集合在設計時間內工作,如果系統能夠手動完成這個工作,那將是非常好的,因爲我擁有所有這些代碼,我認爲我需要使它工作,但正如我所說它有問題 – 2009-06-08 14:18:50

回答

3

我發現我的答案。我錯過了Captions屬性中的這個屬性:DesignerSerializationVisibility(DesignerSerializationVisibility.Content

相關問題