1

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

下面的示例代码。

    [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() 方法获取复制的控件。我不确定有什么问题,有人可以指导我吗?

4

1 回答 1

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...
        }
    }
于 2013-01-03T14:27:28.937 回答