我希望在将其拖放到另一个表单时获得一些控件的副本。我的代码导致移动整个控件。假设我希望它们具有相同的引用,因为源每秒都会更新值,是否可以同时显示其中的两个。
这是我的代码
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);
}
答案 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。
然而,这是控件的惰性“图像”,不会响应输入等。
更强大的方法是创建控件的另一个实例,并将其绑定到与原始数据相同的基础数据。