在表单之间复制控件会改为移动它

时间:2016-04-11 16:05:34

标签: c# winforms

我正在VS 2015中编写Windows窗体应用程序。

根据无线电选择,我想要更改表单的一部分。我要更改的部分我放入了Panel控件。

我目前的计划是在另一个表单上创建4个控件布局。我创建了Form2并在其上创建了4个面板。我想在单击单选按钮时将Form2中面板中的内容复制到Form1中的Panel。

目前,当我单击每个单选按钮时,Form2面板中的控件将消失!他们可能会感动,而不是复制。我点击的第一个确实出现在表单1上,但其他人不会出现在表单1之后。我不希望Form2(RefPanels)完全改变。我只是想复制Form1中的内容。这是我正在尝试的代码。

//RefPanels is my Form2 instance.
public Form2 RefPanels = new Form2();

//Each Radiobutton has something similar to this.
RadioBtn1_CheckChanged(...)
{
  Control[] cArray = new Control[20];
  RefPanels.Panel1.Controls.CopyTo(cArray, 0);

  foreach (Control c in cArray)
  {
    Form1_Destination_Panel.Controls.Add(c);
  }
}

我敢肯定我这一切都错了。你能帮忙吗?

2 个答案:

答案 0 :(得分:2)

您只是复制对您的控件的引用。但控件只能以一种形式使用。因此,控制以“旧”形式消失。您需要控件的真实副本。

C Standard描述了通过反射复制控件的方法。尝试使用这样的解决方案:

private void copyControl(Control sourceControl, Control targetControl)
{
    // make sure these are the same
    if (sourceControl.GetType() != targetControl.GetType())
    {
        throw new Exception("Incorrect control types");
    }

    foreach (PropertyInfo sourceProperty in sourceControl.GetType().GetProperties())
    {
        object newValue = sourceProperty.GetValue(sourceControl, null);

        MethodInfo mi = sourceProperty.GetSetMethod(true);
        if (mi != null)
        {
            sourceProperty.SetValue(targetControl, newValue, null);
        }
    }
}

答案 1 :(得分:0)

我会通过为包含所需布局中的控件的每个面板创建用户控件来实现此目的。然后,当您选择其他布局时,可以创建所需用户控件类的新实例,并将其添加到正确的容器中。这也将允许您保留控件的方法等。