VS Designer中的自定义控件:避免序列化Collection属性

时间:2014-06-01 22:24:11

标签: c# vb.net visual-studio-2012 serialization windows-forms-designer

我制作了一个新的WinForms控件

Public Class jwGraph
    Inherits Control

此控件中包含BindingLists(Of Foo)。为了避免序列化(错误消息)方面的其他Visual Studio错误,我将Serializable属性添加到Foo,并将其他一些标记添加到BindingList(Of Foo)

示例:

Foo声明

<Serializable> _
Public Class FreeMarker

Bindinglist(Of Foo)声明:

<System.ComponentModel.Browsable(False)>
<EditorBrowsable(EditorBrowsableState.Never)>
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)>
    Public WithEvents FreeMarkers As BindingList(Of FreeMarker)

当我使用我的控件时,Visual Studio将base64数据资源添加到表单的resx文件和

这样的行
Me.JwGraph1.FreeMarkers = CType(resources.GetObject("JwGraph1.FreeMarkers"), System.ComponentModel.BindingList(Of jwToolLib.jwGraph.FreeMarker))

给设计师。这样做的问题是,在这一点(或更改程序集)后,我无法以任何方式更改控件代码中的任何内容,因为这样反序列化将失败,我必须付出很大的努力让它再次运行。

许多控件都使用集合。我似乎无法找到他们的实现之间的区别(我试着看反射器中的基本控件)和我的,但他们的集合没有以任何这种方式出现在设计器中。

那么如何防止在设计时将集合生成为二进制资源呢? 它们在控件的构造函数中初始化。

我的代码在VB.net中,但C#中的答案也非常受欢迎。

1 个答案:

答案 0 :(得分:2)

像往常一样,连续3小时染白发,然后决定问,及时找到解决方案:

如此处http://msdn.microsoft.com/en-us/library/53b8022e%28v=VS.100%29.aspx所述,您可以在代码中添加ShouldSerialize[...]函数,以防止特定字段被序列化。我想设计师会评估这些功能,然后决定做什么。

与上面的例子保持一致:

除了

<System.ComponentModel.Browsable(False)>
<EditorBrowsable(EditorBrowsableState.Never)>
<System.ComponentModel.DesignerSerializationVisibility(System.ComponentModel.DesignerSerializationVisibility.Hidden)>
Public WithEvents FreeMarkers As BindingList(Of FreeMarker)

为您的班级添加两项功能:

Public Function ShouldSerializeFreeMarkers() As Boolean
    Return False
End Function
Public Sub ResetFreeMarkers()
    Series = Nothing
End Sub

瞧瞧:没有更多的设计时序列化。