我制作了一个新的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#中的答案也非常受欢迎。
答案 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
瞧瞧:没有更多的设计时序列化。