2009-06-08 7 views
3

J'ai une classe UserControl dans un projet d'application Windows. Une de ses propriétés est une collection d'une autre classe que j'ai définie. Je n'arrive pas à trouver un bon exemple de la façon de faire fonctionner l'éditeur de collection standard au moment de la conception. Je l'ai eu en utilisant un exemple de code que j'ai trouvé dans une certaine mesure, mais les données de ma collection ne sont pas enregistrées. Lorsque je quitte le formulaire et que je l'ouvre au moment du design, les données ne sont plus là.Éditeur de collections dans un contrôle utilisateur au moment du design

Voici ma classe:

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 

End Class

+0

A quoi ressemble exactement votre collection? La plupart du temps, le système la récupère automatiquement ... –

+0

J'ai posté mon code. J'essaie juste de faire fonctionner une collection simple en temps de conception, ce serait génial si le système la récupérait manuellement, comme c'est le cas, j'ai tout ce code dont je pense avoir besoin pour le faire fonctionner, mais comme je l'ai dit –

+1

J'ai trouvé ma réponse L'élément qui me manquait était cet attribut dans la propriété Légendes: DesignerSerializationVisibility (DesignerSerializationVisibility.Content) –

Répondre

3

J'ai trouvé ma réponse. L'élément qui me manquait était cet attribut dans la propriété Légendes: DesignerSerializationVisibility (DesignerSerializationVisibility.Content

+0

Vous devez vous assurer que le type contenu dans la collection est défini pour être sérialisable befor e réglage de ce ou votre studio visuel va avoir un peu en forme –

Questions connexes