将控件从一个窗体拖放到另一个窗体会导致移动控件

时间:2009-10-14 13:46:22

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

我希望在将其拖放到另一个表单时获得一些控件的副本。我的代码导致移动整个控件。假设我希望它们具有相同的引用,因为源每秒都会更新值,是否可以同时显示其中的两个。

这是我的代码

    public partial class DragDropForm : Form
{
    public DragDropForm()
    {
        InitializeComponent();
    }

    private void tableLayoutPanel1_DragEnter(object sender, DragEventArgs e)
    {
        object data = e.Data.GetData(e.Data.GetFormats()[0]);
        if (data is GaugeContainer)
        {
            GaugeContainer gauge = data as GaugeContainer;
            tableLayoutPanel1.Controls.Add(gauge);
        }
        else if (data is DataGridView)
        {
            DataGridView table = data as DataGridView;
            tableLayoutPanel1.Controls.Add(table);

        }
    }

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



    // IN THE SOURCE FORM !!!!
    private void topCompaniesGridView_MouseDown(object sender, MouseEventArgs e)
    {
        this.DoDragDrop(this.topCompaniesGridView, DragDropEffects.Copy);
    }

2 个答案:

答案 0 :(得分:1)

控件一次只能放在一个容器(窗体)上。您要做的是在目标表单上创建一个新的控件实例。所以而不是:

tableLayoutPanel1.Controls.Add(gauge);

DO

tableLayoutPanel1.Controls.Add(new GaugeContainer());
// Bind to same data source as original control here...

然后,您需要将控件绑定到与原始控件相同的数据源,假设您当然具有可轻松绑定的数据源。您在设计时可能已设置的控件上的属性将不会应用于新控件实例。您需要从原始表单上的设计器文件中复制控件初始化代码。

答案 1 :(得分:0)

你可以通过创建一个相同大小的面板(让我们称之为B)并使用VisualBrush和B的背景来显示一个控件(让它称之为A)两次。并将A设置为Visual Brush的Visual。

然而,这是控件的惰性“图像”,不会响应输入等。

更强大的方法是创建控件的另一个实例,并将其绑定到与原始数据相同的基础数据。