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

C# 是否有一种方法可以在不删除控件/GCed的情况下将控件从一个窗体添加到另一个窗体并将其删除?,c#,.net,winforms,C#,.net,Winforms,我有一个表格叫做: MyControlContainerForm ccf SolidForm sf 还有一种主要形式叫做: MyControlContainerForm ccf SolidForm sf 我正在将new MyControlContainerForm()实例中的所有控件添加到SolidForm,使用: sf.Controls.Add ( Control ) 但当我使用以下方法删除它们时: sf.Controls.Remove ( Control ) 它们也从MyCont

我有一个表格叫做:

MyControlContainerForm ccf
SolidForm sf
还有一种主要形式叫做:

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

sf.Controls.Add ( Control )
但当我使用以下方法删除它们时:

sf.Controls.Remove ( Control )
它们也从
MyControlContainerForm
实例中消失

为什么??我该如何防止这种情况


我希望能够随时添加
MyControlContainerForm
控件,而无需每次仅初始化一次
MyControlContainerForm

控件不应同时出现在两个表单上。我很惊讶你能做到这一点,可能是因为你没有表现出我的能力

请注意,控件有一个父属性(=在谁的控件集合中,我是谁?),单数

编辑: 事实上,当按钮1位于panel1上时,它是panel1.Controls的一部分。但是声明

panel2.Controls.Add(button1); 
从panel1.Control中删除按钮1



您可以使用
列表
作为存储。这也可以让它们保持良好的生命力。

控件不应同时出现在两个窗体上。我很惊讶你能做到这一点,可能是因为你没有表现出我的能力

请注意,控件有一个父属性(=在谁的控件集合中,我是谁?),单数

编辑: 事实上,当按钮1位于panel1上时,它是panel1.Controls的一部分。但是声明

panel2.Controls.Add(button1); 
从panel1.Control中删除按钮1



您可以使用
列表
作为存储。这也可以让它们保持良好的生存状态。

发生这种情况的原因不是您要从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); ... ... if(value.parent==this.owner) { value.SendToBack(); } 其他的 { 如果(value.parent!=null) { value.parent.Controls.Remove(值); } base.InnerList.Add(value); ...
正如您在这里看到的,它检查传入控件的父控件,如果它不是集合的所有者,那么它只运行value.parent.controls.Remove(value)将控件从其原始表单中剥离,以便将其添加到当前表单。

发生这种情况的原因不是您正在从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); ... ... if(value.parent==this.owner) { value.SendToBack(); } 其他的 { 如果(value.parent!=null) { value.parent.Controls.Remove(值); } base.InnerList.Add(value); ...

正如您在这里看到的,它检查传入控件的父控件,如果它不是集合的所有者,那么它只运行value.parent.controls.Remove(value)将控件从其原始表单中剥离,以便将其添加到当前表单。

在SolidForm类型上创建类型控件的静态成员并在实例之间共享可能是一种尝试。谢谢,控件类型将存储什么?你是指ccf中的所有控件?你真的开发了imdbNo,我没有。我是一个semi-pro actor:)在SolidForm类型上创建类型控件的静态成员并在实例之间共享它可能是一种尝试。谢谢,控件类型将存储什么?你是指ccf中的所有控件吗?你真的开发了imdbNo,我没有。我是一个semi-pro actor:)好的,谢谢,我会尝试。但是为什么我的引用不可以激活它们。我只是使用MyControlContainerPerform ccf并实例化它,然后添加来自ccf的控件。但是列表应该保留引用?是的,只要您将列表保留在某个位置,列表就会保留引用。谢谢Henk。但我仍然希望它们从ccf添加到此列表中。我想这是可能的。我会让您知道。不,是一个控件ol不能同时出现在两个表单上。因此,要么每次创建一个新ccf,要么在列表中“保存”控件。谢谢,但在不同表单上创建控件的想法是为了布局。所以我这样做了,并将它们收集到一个列表中,所以现在它可以工作了。好的,谢谢,我会尝试。但是为什么我的引用不能使它们保持活力。我只是使用MyControlContainerm ccf和实例,并从ccf添加控件。但是列表应该保留引用?是的,只要您将列表保留在某个位置,列表就会保留引用。谢谢Henk。但我仍然希望它们从ccf添加到此列表中。我想这是可能的。我会让您知道。不,控件不能同时出现在两个窗体上。因此,请每次都要创建一个新的ccf或将控件“保存”到列表中。谢谢,但是在不同的窗体上创建控件的想法是为了布局的目的。所以我这样做了,并将它们收集到一个列表中,所以现在它可以工作了。