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
。您需要释放单个控件,而不是面板本身。有关如何执行此操作的示例,请参见复制。如果您处理了面板
,也可以使用,但是您需要创建一个新的面板。