从MDI表单上/在MDI表单上剪切,复制和粘贴任何用户定义的用户控件

时间:2011-05-06 11:29:24

标签: c#

我在C#3.5的Windows应用程序中创建了许多用户控件。我想复制任何usercontrol并将其粘贴到MDIForm的另一个位置。同样在Cut选项的情况下。我在contextmenustrip中使用这三个选项。当我右键单击usercontrol时,这些选项是可见的。谁能告诉我它将如何在运行时完成?

2 个答案:

答案 0 :(得分:1)

这需要给控件一个新的Parent。 Winforms明确支持,他们甚至可以拥有 no parent,这是一个绝招。您可以通过分配Parent属性直接执行此操作。或者通过将控件添加到另一个Controls集合中,它将自动从之前的控件中删除。

小心,这种灵活性需要付出代价。它也是一个令人讨厌的泄漏源,可能会在一段时间后崩溃您的程序。这是由无父技巧引起的,否则由没有后续粘贴的剪切触发。如果使用Controls.Remove()或Controls.Clear(),则控件将移动到“停放窗口”,这是一个由Winforms管道创建的不可见窗口,用作临时主机。如果你没有将控件移动到另一个父节点或忘记调用它的Dispose()方法,那么控件将永远存在。在程序资源耗尽或用户终止程序之前。

资源炸弹(“无法创建窗口”)通常会在几个小时后发生,因此在调试时很容易错过。您可以在TaskMgr.exe,Processes选项卡中看到它。查看+选择列并勾选USER对象。同时勾选GDI Objects and Handles,让您对不泄漏的程序感到满意。

如果您将控件放在面板上,那么只需一行代码就可以通过移动面板将它们全部移动。

答案 1 :(得分:0)

你可以在剪切的情况下从ControlCollection中删除控件并将其缓存以便在粘贴时将控件添加到其他表单

 panel1.Controls.Add(newPanelButton);// To add, you might have to change the control `Location` as per your need

 panel1.Controls.Remove(newPanelButton);//To remove

如果在同一表单上有剪切/复制效果,您只需将控件的Location更改为要粘贴该控件的新位置即可。