簡體   English   中英

VS Designer中的自定義控件:避免對Collection屬性進行序列化

[英]Custom Control in VS Designer: Avoid serialization of Collection properties

我做了一個新的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#中也很受歡迎。

像往常一樣,將白發直拉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

瞧,不再需要設計時間序列化了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM