【发布时间】:2023-03-09 10:45:02
【问题描述】:
我有一个用户控件,它公开了自定义集合的属性。
这是用户控件中使用的代码。
Imports System.ComponentModel.DesignerSerializationVisibility
Public Class textbox
Inherits System.Windows.Forms.TextBox
Private _validation As New validationList
<System.ComponentModel.DesignerSerializationVisibility(Content)>
Public Property Validation As validationList
Get
Return _validation
End Get
Set(ByVal value As validationList)
_validation = value
End Set
End Property
End Class
这是该属性使用的集合类。
Imports System.Collections.ObjectModel
<Serializable()> Public Class validationList
Inherits Collection(Of validationItem)
Public Shadows Sub Add(ByVal item As validationItem)
'//Check for duplicates
Dim dupe As Boolean = False
For n As Int32 = 0 To Items.Count - 1
If Items(n).Key = item.Key Then
dupe = True
Exit For
End If
Next
If dupe = False Then
Items.Add(item)
End If
End Sub
End Class
这里是集合类使用的项目列表
<Serializable()> Public Class validationItem
Private _key As validationTypes
Private _value As String
Public Sub New()
'//Empty constructor is needed for serialization
End Sub
Public Sub New(ByVal k As validationTypes, ByVal v As String)
_key = k
_value = v
End Sub
Public Enum validationTypes
Madatory = 1
[Integer] = 2
Numeric = 3
[Decimal] = 4
MaxValue = 5
MinValue = 6
MinLength = 7
Email = 8
End Enum
Public Property Value As String
Get
Return _value
End Get
Set(ByVal Value As String)
_value = Value
End Set
End Property
Public Property Key As validationTypes
Get
Return _key
End Get
Set(ByVal value As validationTypes)
_key = value
End Set
End Property
End Class
这是实现 Pluntonix 建议的解决方案后设计器代码的样子..
Dim ValidationItem1 As Testing_Project.validationItem = New Testing_Project.validationItem(Testing_Project.validationItem.validationTypes.MaxValue, "4")
Dim ValidationItem2 As Testing_Project.validationItem = New Testing_Project.validationItem(Testing_Project.validationItem.validationTypes.MinLength, "5")
Me.Textbox1.Validations.Add(ValidationItem1)
Me.Textbox1.Validations.Add(ValidationItem2)
我从设计器中添加了一些项目,并尝试在运行时检索它们,但所有键都设置为 0,值设置为 Nothing。我需要通过设计器添加的项目的确切列表也可用,我怎样才能使它工作,以便通过设计器添加的实际值也存在于运行时。
【问题讨论】:
-
旁注:如果它只包含一个文本框,它可能不需要是一个用户控件。你可以
Inherit TextBox并添加你的东西。 -
@DanielCook 我有这个设置并链接到用户控件中的一个属性。我正在通过设计器添加项目。
-
@DanielCook 我从表单设计器文件中提取了这里是如何添加项目的.. Me.Textbox1.Validations.Add(CType(resources.GetObject("Textbox1.Validation"), Testing_Project。验证项))
-
注意:当设计师访问这样的资源时,这表明序列化 - 主要是您的类型转换器 - (还)不起作用。它也将很快崩溃。他们应该看起来像他们在答案中所做的那样。当它无法弄清楚要做什么和/或您的类型转换器没有帮助它将您的对象作为 Base64 字符串存储在资源中时......但它不能/不会长时间正确地从该字符串中进行 DESerialize。
标签: vb.net user-controls collectioneditor