在Windows窗体中复制粘贴控制C#

问题描述:

我想复制粘贴控件实例使用剪贴板。我能够复制控件但无法取回复制的对象。在Windows窗体中复制粘贴控制C#

下面的示例代码。

[Serializable] 
public class myControl 
{ 
    private Control _copiedControl; 
    public myControl(Control ctrl) 
    { 
     _copiedControl = ctrl; 
    } 

    public Control CopiedControl 
    { 
     get 
     { 
      return _copiedControl; 
     } 
     set 
     { 
      _copiedControl = value;     
     } 
    } 
} 

private void btnCopy_Click(object sender,EventArgs e) 
{ 
    Clipboard.SetData("myControl", new myControl((Control)myButton)); 
}   

private void btnPaste_Click(object sender, EventArgs e) 
{ 
    if(Clipboard.ContainsData("myControl")) 
    { 
       // Condition is satisfied here.. 

     myControl obj = Clipboard.GetData("myControl") as myControl; 
        // obj is null and control is lost.. 
     if(obj != null) 
     { 
      myPanel.Controls.Add(obj.CopiedControl); 
     } 
    } 
} 

我无法使用GetData()方法获取复制的控件。我不确定谁能指导我什么是错的?

+1

在'as myControl'之前有数据吗?另外,显示'myControl'的构造函数。 – Rotem

+0

@Rotem是Clipboard.ContainsData(“myControl”)返回true,我修改了显示正确构造函数的问题。谢谢 – user1417294

+1

但是究竟是什么数据?它以某种方式将按钮序列化为字节? – gideon

您标记了您的“myControl”可序列化,但它实际上并不是可序列化的,Control类不支持二进制序列化。对于与控件关联的窗口的运行时状态来说,太麻烦了,因为窗口只能有一个父窗口。可悲的是Clipboard.SetData()方法不会抱怨。

有一个非常简单的解决方法,剪贴板只能包含一个项目,并且进程之间的复制永远不会工作。所以你不妨假装它,并保留你自己的控制参考。这样的事情:

private Control clipBoardRef; 

    private void btnCopy_Click(object sender, EventArgs e) { 
     clipBoardRef = myButton1; 
     Clipboard.SetData("myControl", "it doesn't matter"); 
    } 

    private void btnPaste_Click(object sender, EventArgs e) { 
     if (Clipboard.ContainsData("myControl")) { 
      Control ctl = clipBoardRef; 
      // etc... 
     } 
    }