我正在尝试使用剪贴板复制粘贴控件实例。我能够复制控件但无法取回复制的对象。
以下示例代码。
[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()方法获取复制的控件。我不确定有什么不对的人可以指导我吗?
答案 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...
}
}