Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何从内存中删除控件集合_C#_Dispose_Controlcollection - Fatal编程技术网

C#如何从内存中删除控件集合

C#如何从内存中删除控件集合,c#,dispose,controlcollection,C#,Dispose,Controlcollection,我使用面板将控件从不同窗体加载到主窗体中 Form1 Form1_loaded = new Form1() { Dock = DockStyle.Fill, TopLevel = false, TopMost = true }; Form1_loaded.FormBorderStyle = FormBorderStyle.None; this.Panel1.Controls.Add(Form1_loaded); 这很有效,没问题。 然后我想加载另一个控件,比

我使用面板将控件从不同窗体加载到主窗体中

Form1 Form1_loaded = new Form1() { Dock = DockStyle.Fill, TopLevel = false, TopMost = true };
Form1_loaded.FormBorderStyle = FormBorderStyle.None;                  
this.Panel1.Controls.Add(Form1_loaded);
这很有效,没问题。 然后我想加载另一个控件,比如从Form2

 this.Panel1.Controls.Clear();
 Form2 Form2_loaded = new Form2() { Dock = DockStyle.Fill, TopLevel = false, TopMost = true };
 Form2_loaded.FormBorderStyle = FormBorderStyle.None;                  
 this.Panel1.Controls.Add(Form2_loaded);
在这一点上,它工作得很好。但是问题是
Clear()
方法没有从内存中删除控件。因此,当我使用10.000控件(据我所知,这是限制),在不同的窗体控件之间来回加载时,我将得到一个未处理的错误。甚至不可能用try/catch来处理

然后我读到应该使用Dispose()方法。 但是,如果我使用
Panel1.Dispose()
,它将完全消失,并且我无法再让它加载其他控件。 如果我使用
this.Panel1.Controls.Dispose()
Control.ControlCollection不包含“Dispose”的定义


谢谢大家

第一个问题是Clear()不调用控件的Dispose(),它只从面板中删除它们

第二个原因是您正在处理面板而不是控件,这就是它消失的原因

因此,请尝试先删除控件,然后再处理它们:

while(this.Panel1.Controls.Count>0)
{
var control=this.Panel1.Controls[0];
此.Panel1.Controls.RemoveAt(0);
control.Dispose();
}

您可能对控件或其中的某些内容有挥之不去的引用。可能不是控件本身。一切都妥善处理了吗?正在删除的事件?这种情况有很多种可能发生,很可能与孩子的控制无关。例如,您可以尝试添加和删除
面板
,而不是更复杂的控件。应在控件而不是集合上调用Dispose。请释放面板,并将新面板分配给
this.Panel1
。您需要释放单个控件,而不是
面板本身。有关如何执行此操作的示例,请参见复制。如果您处理了
面板
,也可以使用,但是您需要创建一个新的面板。