在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()方法获取复制的控件。我不确定谁能指导我什么是错的?
答
您标记了您的“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...
}
}
在'as myControl'之前有数据吗?另外,显示'myControl'的构造函数。 – Rotem
@Rotem是Clipboard.ContainsData(“myControl”)返回true,我修改了显示正确构造函数的问题。谢谢 – user1417294
但是究竟是什么数据?它以某种方式将按钮序列化为字节? – gideon