【发布时间】:2011-05-06 20:06:19
【问题描述】:
我在 C# 3.5 的 Windows 应用程序中创建了许多用户控件。我想复制任何用户控件并将其粘贴到 MDIForm 的另一个位置。在 Cut 选项的情况下也是如此。我在上下文菜单中使用这三个选项。当我右键单击用户控件时,这些选项是可见的。谁能告诉我在运行时如何完成?
【问题讨论】:
标签: c#
我在 C# 3.5 的 Windows 应用程序中创建了许多用户控件。我想复制任何用户控件并将其粘贴到 MDIForm 的另一个位置。在 Cut 选项的情况下也是如此。我在上下文菜单中使用这三个选项。当我右键单击用户控件时,这些选项是可见的。谁能告诉我在运行时如何完成?
【问题讨论】:
标签: c#
这需要给控件一个新的父级。 Winforms 明确支持,它们甚至可以有 no 父级,这真是一个技巧。您可以通过分配 Parent 属性直接执行此操作。或者通过将控件添加到另一个 Controls 集合中,它将自动从之前所在的集合中删除。
请注意,这种灵活性是有代价的。它也是严重泄漏的来源,可能会在一段时间后使您的程序崩溃。这是由无父技巧引起的,否则由没有后续粘贴的剪切触发。如果您使用 Controls.Remove() 或 Controls.Clear() 则控件将移动到“停车窗口”,这是一个由 Winforms 管道创建的不可见窗口,充当临时主机。如果您随后不将控件移动到另一个父级或忘记调用其 Dispose() 方法,则该控件将永远存在。直到您的程序耗尽资源或用户终止程序。
资源不足炸弹(“无法创建窗口”)通常在几个小时后发生,因此在调试时很容易错过。您可以在 TaskMgr.exe 的“进程”选项卡中看到它。查看 + 选择列并勾选 USER 对象。还要勾选 GDI 对象和句柄,以确保您的程序没有泄漏。
如果您将控件放在面板上,则只需一行代码即可通过移动面板将它们全部一起移动。
【讨论】:
您可以在剪切的情况下从 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 更改为您要粘贴该控件的新位置。
【讨论】: