Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计时用户控件内的集合编辑器_C#_.net_Vb.net - Fatal编程技术网

C# 设计时用户控件内的集合编辑器

C# 设计时用户控件内的集合编辑器,c#,.net,vb.net,C#,.net,Vb.net,我在Windows应用程序项目中有一个UserControl类。它的一个属性是我定义的另一个类的集合。我似乎找不到一个好的例子来说明如何让标准集合编辑器在设计时为其工作 我在某种程度上使用了我找到的一些示例代码,但我收集的数据没有保存。当我退出表单并在设计时打开它时,数据就不再存在了 这是我的班级: Public Class Gauge Inherits Control Private WithEvents _Captions As New CaptionCollection <Cat

我在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
公共类仪表
继承控制权
Private WithEvents\u标题作为新标题集合
_
公共属性Captions()作为CaptionCollection
得到
返回标题
结束
设置(作为CaptionCollection的ByVal值)
_标题=值
端集
端属性
_
公共类标题
Private _textas String=“”
Private _coloras Color=Color.Black
Private _TextIsValue为布尔值
私有位置作为新点(0,0)
公共属性Text()作为字符串
得到
返回文本
结束
设置(ByVal值作为字符串)
如果是文本值,则
_文本=值
如果结束
端集
端属性
公共属性Color()作为颜色
得到
返回颜色
结束
设置(ByVal值作为颜色)
如果_颜色值,则
_颜色=值
如果结束
端集
端属性
公共属性TextIsValue()为布尔值
得到
返回_TextIsValue
结束
设置(ByVal值为布尔值)
如果_TextIsValue,则
_TextIsValue=value
如果结束
端集
端属性
公共属性位置()作为点
得到
返回位置
结束
设置(ByVal值作为点)
如果_位置值,则
_位置=值
如果结束
端集
端属性
末级
公共类标题集合
继承CollectionBase
实现ICustomTypeDescriptor
公共子添加(ByVal c作为标题)
Me.List.Add(c)
端接头
公共子删除(ByVal c作为标题)
Me.List.Remove(c)
端接头
默认公共只读属性项(ByVal索引为整数)作为标题
得到
返回DirectCast(Me.List(索引),标题)
结束
端属性
'接口ICustomTypeDescriptor的实现
公共函数GetClassName()作为字符串实现System.ComponentModel.ICustomTypeDescriptor.GetClassName
返回TypeDescriptor.GetClassName(Me,True)
端函数
公共函数GetAttributes()作为AttributeCollection实现System.ComponentModel.ICustomTypeDescriptor.GetAttributes
返回TypeDescriptor.GetAttributes(Me,True)
端函数
公共函数GetComponentName()作为字符串实现System.ComponentModel.ICustomTypeDescriptor.GetComponentName
返回TypeDescriptor.GetComponentName(Me,True)
端函数
作为类型转换器的公共函数GetConverter()实现System.ComponentModel.ICustomTypeDescriptor.GetConverter
返回TypeDescriptor.GetConverter(Me,True)
端函数
作为EventDescriptor的公共函数GetDefaultEvent()实现System.ComponentModel.ICustomTypeDescriptor.GetDefaultEvent
返回TypeDescriptor.GetDefaultEvent(Me,True)
端函数
公共函数GetDefaultProperty()作为PropertyDescriptor实现System.ComponentModel.ICustomTypeDescriptor.GetDefaultProperty
返回TypeDescriptor.GetDefaultProperty(Me,True)
端函数
作为对象的公共函数GetEditor(ByVal editorBaseType作为类型)实现System.ComponentModel.ICustomTypeDescriptor.GetEditor
返回TypeDescriptor.GetEditor(Me,editorBaseType,True)
端函数
公共函数GetEvents(ByVal属性作为属性())作为EventDescriptorCollection实现System.ComponentModel.ICustomTypeDescriptor.GetEvents
返回TypeDescriptor.GetEvents(Me、attributes、True)
端函数
作为EventDescriptorCollection的公共函数GetEvents()实现System.ComponentModel.ICustomTypeDescriptor.GetEvents
返回TypeDescriptor.GetEvents(Me,True)
端函数
作为对象实现System.ComponentModel.ICustomTypeDescriptor.GetPropertyOwner的公共函数GetPropertyOwner(ByVal pd作为PropertyDescriptor)
还我
端函数
公共函数GetProperties(ByVal属性作为属性())作为PropertyDescriptorCollection实现System.ComponentModel.ICustomTypeDescriptor.GetProperties
返回GetProperties()
端函数
公共函数GetProperties()作为PropertyDescriptorCollection实现System.ComponentModel.ICustomTypeDescriptor.GetProperties
'创建用于保存属性描述符的集合对象
将pds变暗为新属性DescriptorCollection(无)
'迭代员工列表
对于i As Integer=0的Me.List.Count-1
'为标题项创建属性描述符并添加到属性描述符集合
Dim pd作为新标题CollectionPropertyDescriptor(Me,i)
pds.Add(pd)
下一个
'返回属性描述符集合
返回pds
端函数
末级
'这是一个特殊类型转换器,它将与标题类关联。
'它将标题对象转换为字符串表示形式,以便在属性网格中使用。
友元类字幕转换器
继承ExpandableObjectConverter
公共重载将函数ConvertTo(ByVal上下文作为ITypeDescriptorContext,ByVal区域性作为System.Globalization.CultureInfo,ByVal值作为对象,ByVal destType作为类型)重写为对象
“返回”(收集)
如果destType是GetType(String),并且值的类型也是Caption,则
'将值强制转换为标题类型