代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

是否有方法在不删除控件/gced的情况下将控件从窗体添加到另一个窗体并将其删除?

  •  0
  • Joan Venge  · 技术社区  · 15 年前

    我有一张表格叫:

    MyControlContainerForm ccf
    

    主要形式是:

    SolidForm sf
    

    我正在添加的实例中的所有控件 new MyControlContainerForm () SolidForm ,使用:

    sf.Controls.Add ( Control )
    

    但当我用以下方法移除它们时:

    sf.Controls.Remove ( Control )
    

    他们离开了 MyControlContainerForm 还有实例。

    为什么?我该怎么预防呢?

    我想能够添加 MyControlContainerForm(MyControlContainerForm) 随时控制,不初始化 MyControlContainerForm(MyControlContainerForm) 每次,就一次。

    2 回复  |  直到 12 年前
        1
  •  2
  •   SamuelWarren    15 年前

    发生这种情况的原因不是您要从Form2中删除控件,而是要添加它们。无法在窗体之间共享控件。如果您查看控件集合枚举器上Form2.Controls.Add()的反射代码,我们可以看到这里发生了什么:

    ...
      if (value.parent == this.owner)
            {
                value.SendToBack();
            }
            else
            {
                if (value.parent != null)
                {
                    value.parent.Controls.Remove(value);
                }
                base.InnerList.Add(value);
    ...
    

    正如您在这里看到的,它检查传入控件的父级,如果它不是集合的所有者,那么它只运行一个值.parent.control s.remove(value),从它的原始窗体中除去该控件,以便将其添加到当前窗体中。

        2
  •  1
  •   Henk Holterman    15 年前

    控件不能同时位于两个窗体上。我很惊讶你能接受,可能是因为你没有显示MyControlContainerForm。

    注意,控件有一个父属性(=who's control s集合中是i?),单数。

    编辑:

    实际上,当button1在panel1上时,它是panel1.controls的一部分。但是声明

    panel2.Controls.Add(button1); 
    

    移除 面板1的按钮1。控件。


    你可以使用 List<Control> 作为商店。这也会让他们活得很好。