2009-10-14 101 views
1

我想将某个控件的另一个副本拖放到另一个窗体时。我的代码导致移动整个控件。是否有办法一次显示它们中的两个,因为我希望它们具有相同的引用,因为源每秒更新一次值。将控件从一个窗体拖放到另一个窗体导致移动控件

这里是我的代码

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); 
    } 

回答

1

的控制只能在一个容器(形式),在同一时间内选址。你想要做的是在目标表单上创建一个新的控件实例。因此,而不是:

tableLayoutPanel1.Controls.Add(gauge); 

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

然后,您需要到控制到同一数据源作为原始控件绑定,假设你有当然是一个很容易绑定数据源。您可能在设计时设置的控件上的属性不会应用于新的控件实例。您需要从原始表单上的设计器文件复制控制初始化代码。

0

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

然而,这是在控制的惰性“图像”,并且不会响应输入等

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

相关问题