正确处理/关闭用户控件

Kha*_*uez 2 .net garbage-collection memory-leaks winforms

我有一个Windows窗体屏幕,其中一个菜单栏停靠在窗体的左侧,类似于Outlook 2003,并且一个面板占据了窗体右侧的其余部分.

我的左侧菜单包含项目.单击这些项目后,我想在右侧面板上加载相应的用户控件(充当"子窗体").我设法做到了,它运作良好.

我担心的是我的用户控件是否正确处理,或者当用户单击另一个菜单项时它们是否保留在内存中(因此,加载另一个usercontrol /子表单).

代码类似于:

    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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我不确定我在方法开头调用的panel1.Controls.Clear()是否足以让不再使用的用户控件在适当的时候被垃圾收集?

根据我的理解,一旦从面板中清除,应用程序中不应该有任何参考,但我不确定我是否应该做其他事情或者我可以使用的相当轻量级的工具来确认我的子表单已被处理他们应该和它不会导致某种内存/资源泄漏?

har*_*357 6

在调用之前使用此循环,panel1.Controls.Clear()并确保Dispose()用户控件中的方法依次处理任何可处置资源.

foreach (Control control in panel1.Controls)
{
   control.Dispose();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

for every 循环无法完成这项工作。因为每次处理后元素和索引都会更改。

每次都需要一个 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()
Run Code Online (Sandbox Code Playgroud)