我有一个Windows窗体屏幕,其中一个菜单栏停靠在窗体的左侧,类似于Outlook 2003的菜单栏,还有一个面板占据窗体右侧的其余部分。
我的左边菜单包含了一些项目。单击这些项后,我希望在右侧面板上加载适当的用户控件(充当“子窗体”)。我已经成功地做到了这一点,并且工作得很好。
不过,我担心的是,我的用户控件是否被正确放置,或者当用户单击另一个菜单项(因此,加载另一个用户控件/子窗体)时,它们是否仍留在内存中。
代码如下所示:
private void ultraExplorerBar1_ItemClick(object sender, Infragistics.Win.UltraWinExplorerBar.ItemEventArgs e)
{
panel1.Controls.Clear();
if (e.Item.Key == "Action")
{
ActionUserControl subForm = new ActionUserControl();
panel1.Controls.Add(subForm);
subForm.Show();
}
else if (e.Item.Key == "Options")
{
OptionsUserControl subForm = new OptionsUserControl();
panel1.Controls.Add(subForm);
subForm.Show();
}
}我不确定我在方法开始时调用的panel1.Controls.Clear()是否足以让不再使用的用户控件在适当的时候被垃圾回收?
据我所知,一旦从面板中清除,应用程序中不应该留下任何引用,但我不确定我是否应该做其他事情,或者是一个合理的轻量级工具,我可以使用它来确认我的子窗体按应该的方式进行了处理,并且不会导致某种内存/资源泄漏?
发布于 2011-11-03 02:39:49
在调用panel1.Controls.Clear()之前使用此循环,并确保用户控件中的Dispose()方法依次释放所有可释放的资源。
foreach (Control control in panel1.Controls)
{
control.Dispose();
}发布于 2012-12-28 06:07:18
for each循环不会完成这项工作。因为在每次处理之后,元素和索引都会发生变化。
你每次都需要一个while循环来处理最顶层的控件。
在我使用的以下代码中,我有一个带有用户控件的面板。我进入第一个控件并释放它的控件,然后释放控件本身。
处理完所有控件后,触发清除以重置索引。
While pnlMain.Controls.Count > 0
While pnlMain.Controls(0).Controls.Count > 0
pnlMain.Controls(0).Controls(0).Dispose()
End While
pnlMain.Controls(0).Dispose()
End While
pnlMain.Controls.Clear()发布于 2011-11-03 02:47:51
我用动态内容做了足够多的工作,所以我已经将这个方法添加到了我的基页类中:
/// <summary>
/// Dispose a control and all its children
/// </summary>
public void DisposeControl(Control c)
{
if (null != c)
using (c)
DisposeChildControlsOf(c);
}
/// <summary>
/// Dispose (and remove) all the children of a control
/// </summary>
public void DisposeChildControlsOf(Control c)
{
if (null != c)
if (null != c.Controls)
while (c.Controls.Count > 0)
{
Control child = c.Controls[0];
c.Controls.RemoveAt(0);
DisposeControl(child);
}
}它也是递归的。然后这样叫它(如果你自己不拥有这个控件):
DisposeChildControlsOf(panel1);或
DisposeControl(myDynamicallyGeneratedControl);https://stackoverflow.com/questions/7981296
复制相似问题