如何拖放控件的副本

时间:2014-10-28 10:28:34

标签: c# .net drag-and-drop drag

虽然我得到了如何移动控件并将现有控件拖放到互联网搜索中,但我没有得到如何将控件复制到面板/组合框等的解决方案。

我正在开发一个应用程序,我从中拖放按钮  小组到另一个小组。我需要的是从Panel-1拖动一个按钮  并在Panel-2中粘贴它的“副本”。这是一个截图

enter image description here

2 个答案:

答案 0 :(得分:0)

有一种内置方式,一种Object有一个名为MemberwiseClone的受保护方法,它应该对你对象上的所有成员进行高级别的克隆。你可以在这里阅读:

ICloneable Interface:支持克隆,它创建一个与现有实例具有相同值的类的新实例。

ICloneable接口使您能够提供创建现有对象副本的自定义实现。 ICloneable接口包含一个成员Clone方法,该方法旨在提供超出Object.MemberwiseClone提供的克隆支持。有关克隆,深拷贝和浅拷贝以及示例的详细信息,请参阅Object.MemberwiseClone方法。

http://msdn.microsoft.com/en-us/library/system.icloneable.aspx

public class ControlCloner<T>
{
  public T CloneObject(T sourceObject)
 {
     T newObject = new T();

   // Set properties & events of newObject using reflection... look at the methods available on the Type class.
      return newObject;
   }
 }

答案 1 :(得分:0)

我有自己的解决方案。

首先将Panel的AllowDrop属性设置为true。

panel1.AllowDrop=true;

从属性窗口为Panel创建DragEnter事件

private void panel1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

接下来,从属性窗口

为Panel创建DragDrop事件
private void panel1_DragDrop(object sender, DragEventArgs e)
{
     Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control;
     // Declare rnd globally for creating random id for dynamic button(eg : Random rnd = new Random();)
     Button btn = new Button();
     btn.Name = "Button" + rnd.Next(); 
     btn.Size = c.Size;            
     btn.Click += new System.EventHandler(DynamicButton_Click);
     if (c != null)
     {                
         btn.Text = c.Text;
         btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
         this.panel1.Controls.Add(btn);
     }
}