有没有办法Deep Copy Winforms控件?

时间:2016-07-29 11:27:24

标签: vb.net winforms controls

我尝试深度复制ToolStripMenuItems以将副本添加到其他不同的ToolStripMenu中。

当我尝试序列化ToolStripMenuItem时,它返回Nothing(下面代码中的第4行)并且无法创建该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()

3 个答案:

答案 0 :(得分:2)

没有Winform Control是可序列化的,因为它们都带有活动窗口的句柄,根据定义,它与序列化不兼容。

所以你必须找到另一种方法。我的建议是创建一个构建全新MenuItems的函数,并在表单上随时调用它。

为此,您在Designer中创建菜单,然后打开文件“MyForm.Designer.vb”并复制创建菜单的部分,然后将其放入函数中。

答案 1 :(得分:1)

正确的序列化需要了解内部(私有成员),以便可以恢复状态,因此只能由给定类型本身完成。因此,如果给定类型不可序列化,您将需要以不同的方式解决更广泛的问题,或解决问题(可能通过执行MemberwiseClone),这可能会破坏您对深度克隆的定义

答案 2 :(得分:0)

我是根据这篇文章做到的: http://www.codeproject.com/Articles/1111658/Fast-Deep-Copy-of-Objects-by-Expression-Trees-Csha?msg=5277674

请注意: 在创建WinForms控件的克隆时,将断开父子连接(父控件不知道克隆对象)。您必须使用

插入新控件
 target.AddControl(clone)

确保重新创建此连接并显示克隆的控件