2016-07-29 97 views
-1

我嘗試深入複製ToolStripMenuItems以將副本添加到不同的其他ToolStripMenu。有沒有辦法深入複製Winforms控件?

當我試圖序列它返回Nothing(4號線在下面的代碼)並沒有作出這樣的ToolStripMenuItem的新實例的ToolStripMenuItem。

Public Module Extensions 
    <System.Runtime.CompilerServices.Extension()> _ 
    Public Function DeepCopy(Of T)(ByVal Obj As T) As T 
     If Obj.GetType().IsSerializable = False Then Return Nothing 

     Using MStream As New MemoryStream 
      Dim Formatter As New BinaryFormatter 
      Formatter.Serialize(MStream, Obj) 
      MStream.Position = 0 
      Return DirectCast(Formatter.Deserialize(MStream), T) 
     End Using 
    End Function 
End Module 

我的副本

Dim tsmiCopy As ToolStripMenuItem = tsmiOriginal.DeepCopy() 
+0

這是這一行:'如果Obj.GetType()IsSerializable = false,那麼返回Nothing'返回'Nothing'。如果您要刪除該行,您將得到一個異常,指出組件不可序列化。 –

+1

查看您的designer.cs文件的代碼。只需複製這些代碼並將它們放入方法中,並在需要工具條的克隆副本時調用該方法,請參閱@SuperPeanut答案。 –

回答

2

沒有WinForm控件是序列化的,至於原因,他們都隨身攜帶一個句柄活躍窗口,根據定義,它與序列化不兼容。

所以你必須找到周圍的另一種方式。我的建議是創建一個函數來構建一個全新的MenuItems,並隨時在表單上需要時調用它。

爲此,您可以在Designer中創建菜單,然後打開文件「MyForm.Designer.vb」並複製創建菜單的部分,然後將其放入函數中。

1

正確的序列化要求的內部(私有成員)的知識,使狀態能夠恢復,這樣才能真正由給定類型本身來完成。因此,如果給定類型不可序列化,則需要以不同方式解決更廣泛的問題,或解決此問題(可能通過執行MemberwiseClone),這可能會破壞深克隆的定義。

相關問題