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

时间:2013-01-03 13:52:20

标签: c# .net winforms

我正在尝试使用剪贴板复制粘贴控件实例。我能够复制控件但无法取回复制的对象。

以下示例代码。

    [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 个答案:

答案 0 :(得分:2)

您将“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...
        }
    }