【问题标题】:Load form's controls to panel in C#将表单的控件加载到 C# 中的面板
【发布时间】:2013-10-18 08:51:54
【问题描述】:

我想将 Form 的控件加载到 C# 中的面板中,以便面板显示与表单相同的组件。我试过这段代码:

foreach (Control control in (new Form2()).Controls)
{
    panels[panelsCounter].Controls.Add(control);
}

但问题是,当我运行程序时,它只加载我最后添加的控件类型(例如,如果我添加了一个标签,然后我在表单中添加了一个按钮它只显示一个按钮,但如果我添加另一个标签,它会显示两个标签,但不显示按钮)。

请帮帮我。

【问题讨论】:

  • 您没有设置位置。地点是预设好的吗?

标签: c# controls panel


【解决方案1】:

这是一个经典的错误,您在迭代集合时正在修改集合。副作用是只有其他控件才会移动到面板上。您需要小心地执行此操作,向后迭代集合以避免该问题:

var formObj = new Form2();    //???
for (int ix = formObj.Controls.Count-1; ix >= 0; --ix) {
    panels[panelsCounter].Controls.Add(formObj.Controls[ix]);
}

【讨论】:

  • 汉斯,那样的话应该抛出InvalidOperationException吧?
  • 不,不是每个集合类型都实现该检查。 Control.ControlCollection 没有。
  • 你是个好人,对不起,我不能投票给你。我已经投票了所以不允许我这样做:(
  • 请问您是如何获得这么多知识的?
  • 是头发,白胡子,上面什么都没有:)
【解决方案2】:

控件并非设计为多次显示。您不能将控件添加到多个窗体,或将相同的控件添加到窗体多次。它们根本不是为了支持它而设计的。

您可以遍历每个控件并创建一个相同类型的新控件,甚至复制它们的属性值(或者至少是您可以公开访问的值),从而有效地克隆它们,但重要的是它是您添加到新面板的不同控件。

【讨论】:

  • 您可以看到OP正在创建new Form2()并将其控件添加到面板中,这应该不是问题,控件将从表单中删除并添加到面板中。他没有从现有实例中删除
  • @SriramSakthivel 但他没有从表单中删除控件。他要把他们留在这两个地方。它们不是为了支持这一点而构建的。例如,control.Parent 将包含什么?它不能有两个父母。在两个容器中拥有一个控件的想法存在根本缺陷。
  • 不,IIRC 然后添加一个由另一个父级控制的控件将自动从前一个父级删除并将其添加到下一个父级。所以这不应该是一个问题(虽然这不是一个好主意而且看起来很丑)
  • control.Parent 将包含新的Parent 试试看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
相关资源
最近更新 更多