gpt4 book ai didi

.net - 具有设计器可浏览属性的 VB.NET 用户控件在运行时不保存值

转载 作者:行者123 更新时间:2023-11-30 23:45:53 29 4
gpt4 key购买 nike

我一直在制作一个控件并为(CustomClass 的)列表添加了一个属性。自定义类包含一个字符串、一个图像和另一个包含字符串和图像的自定义类的列表。我通过添加可浏览的属性将此属性添加到设计器中,并且所有这些属性似乎都能正常工作。

运行程序时出现了我的问题。我可以设置属性中的所有值,我可以返回它们并保存它们,但是,一旦我运行程序,由于属性设置为 Nothing,这些值就会被清除。

为了允许我的属性被编辑和保存,我意识到我必须初始化列表并且已经在属性的访问器方法中这样做了(如果属性的值是空的)。

我修改了设计器中的值,并在所有使用该属性及其基础字段的项目以及该属性的方法本身上放置了一个断点。第一个断点命中是它被访问并且该值始终为空。

我不确定这些值应该存储在哪里,因为我检查了设计器代码通常存储字符串等类型的位置,并且我检查了资源以查看它们是否已保存在那里(就像图像一样) .运行代码后,设计器中的值也会被清除。

控件中的一些代码

    Private _Items As List(Of Models.Category) = New List(Of Models.Category)

<Browsable(True), _
EditorBrowsable(EditorBrowsableState.Always), _
Category("Data"), _
Description("The items with sub items that should be displayed"), _
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property Items As List(Of Models.Category)
Get
'Return _Items
Return Me.ExpMenu1.Categories
End Get
Set(ByVal value As List(Of Models.Category))
Me.ExpMenu1.Categories = value
'_Items = value
End Set
End Property

ExpMenu1 中的违规代码
        ''' <summary>
''' Gets or sets the categories.
''' </summary>
''' <value>The categories.</value>
Public Property Categories() As List(Of Category)
Get
If m_Categories Is Nothing Then
m_Categories = New List(Of Category)
End If
Return m_Categories
End Get
Set(ByVal value As List(Of Category))
m_Categories = value
End Set
End Property

顶级类(class)(类别)
Imports System.Collections.Generic

Namespace ExpandingMenuWPF.Models
''' <summary>
''' Category class.
''' </summary>
Public Class Category
''' <summary>
''' Gets or sets the name of the category.
''' </summary>
''' <value>The name of the category.</value>
Public Property CategoryName() As String
Get
Return _CategoryName
End Get
Set(ByVal value As String)
_CategoryName = value
End Set
End Property
Private _CategoryName As String
''' <summary>
''' Gets or sets the sub items.
''' </summary>
''' <value>The Sub Items.</value>
Public Property SubItems() As List(Of SubItem)
Get
Return _SubItems
End Get
Set(ByVal value As List(Of SubItem))
_SubItems = value
End Set
End Property
Private _SubItems As New List(Of SubItem)

Private _ShowImage As Boolean
Public Property ShowImage() As Boolean
Get
Return _ShowImage
End Get
Set(ByVal value As Boolean)
_ShowImage = value
End Set
End Property

Private _Image As Image
Public Property CategoryImage() As Image
Get
Return _Image
End Get
Set(ByVal value As Image)
_Image = value
End Set
End Property


End Class
End Namespace

嵌套类(Subitem)
Namespace ExpandingMenuWPF.Models
''' <summary>
''' Sub Item class.
''' </summary>

Public Class SubItem

Public Sub New()

End Sub

''' <summary>
''' Gets or sets the title.
''' </summary>
''' <value>The title.</value>
Public Property Title() As String
Get
Return _Title
End Get
Set(ByVal value As String)
_Title = value
End Set
End Property
Private _Title As String

Private _ShowImage As Boolean
Public Property ShowImage() As Boolean
Get
Return _ShowImage
End Get
Set(ByVal value As Boolean)
_ShowImage = value
End Set
End Property

Private _Image As Image
Public Property SubItemImage() As Image
Get
Return _Image
End Get
Set(ByVal value As Image)
_Image = value
End Set
End Property

End Class
End Namespace

如果有人对值应该存储在哪里有任何想法或知识,我将不胜感激。我不认为我在做任何特别复杂的事情。

Resx 文件。部分元素数据:
<data name="ExpandingVerticalMenu1.Items" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAEdFeHBhbmRpbmdNZW51V1BGLCBWZXJzaW9uPTEuMC4wLjAsIEN1
bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAUVN5c3RlbS5EcmF3aW5nLCBWZXJz
aW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEz
YQUBAAAAIEV4cGFuZGluZ01lbnVXUEYuTW9kZWxzLkNhdGVnb3J5BAAAAA1fQ2F0ZWdvcnlOYW1lCV9T
dWJJdGVtcwpfU2hvd0ltYWdlBl9JbWFnZQEDAASNAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxp
c3RgMVtbRXhwYW5kaW5nTWVudVdQRi5Nb2RlbHMuU3ViSXRlbSwgRXhwYW5kaW5nTWVudVdQRiwgVmVy
c2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQEUU3lzdGVt
LkRyYXdpbmcuSW1hZ2UDAAAAAgAAAAYEAAAABENhdDEJBQAAAAAKBAUAAACNAVN5c3RlbS5Db2xsZWN0
aW9ucy5HZW5lcmljLkxpc3RgMVtbRXhwYW5kaW5nTWVudVdQRi5Nb2RlbHMuU3ViSXRlbSwgRXhwYW5k
aW5nTWVudVdQRiwgVmVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
PW51bGxdXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBAAAIUV4cGFuZGluZ01lbnVXUEYuTW9kZWxz
LlN1Ykl0ZW1bXQIAAAAICAkGAAAAAQAAAAQAAAAHBgAAAAABAAAABAAAAAQfRXhwYW5kaW5nTWVudVdQ
Ri5Nb2RlbHMuU3ViSXRlbQIAAAAJBwAAAA0DBQcAAAAfRXhwYW5kaW5nTWVudVdQRi5Nb2RlbHMuU3Vi
SXRlbQMAAAAGX1RpdGxlCl9TaG93SW1hZ2UGX0ltYWdlAQAEARRTeXN0ZW0uRHJhd2luZy5JbWFnZQMA
AAACAAAABggAAAAEU3ViMQAKCw==
</value>

提示最后一行。

最佳答案

在设计时对您的 *.Designer.vb 所做更改的序列化文件由 DesignerSerializationVisibility attribute 控制.

它可以是 three possible values 之一:

Hidden: The code generator does not produce code for the object.
Visible: The code generator produces code for the object.
Content: The code generator produces code for the contents of the object, rather than for the object itself.



在您的情况下,您正在尝试序列化 List(Of T) 的内容。 ,这意味着您需要告诉代码生成器为对象的内容生成代码,而不是为对象本身— DesignerSerializationVisibility.Content值(value)。

您当前的值设置为 Hidden ,这会阻止代码生成器为对象生成任何代码!更常见的错误是将其设置为 Visible .虽然这几乎总是您想要的持久性,但对于表示包含您有兴趣序列化的数据的集合(如 List(Of T) )的属性,这不会起作用。

因此,您需要更改您的属性(property)声明以包含以下内容:
<Browsable(True), _
EditorBrowsable(EditorBrowsableState.Always), _
Category("Data"), _
Description("The items with sub items that should be displayed"), _
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public Property Items As List(Of Models.Category)
Get
'Return _Items
Return Me.ExpMenu1.Categories
End Get
Set(ByVal value As List(Of Models.Category))
Me.ExpMenu1.Categories = value
'_Items = value
End Set
End Property

那应该很好用。在设计时所做的任何更改都将被设计器代码生成器自动保存到与您的表单相关联的 *.Designer.vb 中。文件,并与您的项目一起保存。但是,正如评论中所讨论的,这不适用于运行时所做的更改。

关于.net - 具有设计器可浏览属性的 VB.NET 用户控件在运行时不保存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7093732/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com