首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确处置/关闭用户控件

正确处置/关闭用户控件
EN

Stack Overflow用户
提问于 2011-11-02 21:39:08
回答 3查看 12.6K关注 0票数 2

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

我的左边菜单包含了一些项目。单击这些项后,我希望在右侧面板上加载适当的用户控件(充当“子窗体”)。我已经成功地做到了这一点,并且工作得很好。

不过,我担心的是,我的用户控件是否被正确放置,或者当用户单击另一个菜单项(因此,加载另一个用户控件/子窗体)时,它们是否仍留在内存中。

代码如下所示:

代码语言:javascript
复制
    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()是否足以让不再使用的用户控件在适当的时候被垃圾回收?

据我所知,一旦从面板中清除,应用程序中不应该留下任何引用,但我不确定我是否应该做其他事情,或者是一个合理的轻量级工具,我可以使用它来确认我的子窗体按应该的方式进行了处理,并且不会导致某种内存/资源泄漏?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-03 02:39:49

在调用panel1.Controls.Clear()之前使用此循环,并确保用户控件中的Dispose()方法依次释放所有可释放的资源。

代码语言:javascript
复制
foreach (Control control in panel1.Controls)
{
   control.Dispose();
}
票数 6
EN

Stack Overflow用户

发布于 2012-12-28 06:07:18

for each循环不会完成这项工作。因为在每次处理之后,元素和索引都会发生变化。

你每次都需要一个while循环来处理最顶层的控件。

在我使用的以下代码中,我有一个带有用户控件的面板。我进入第一个控件并释放它的控件,然后释放控件本身。

处理完所有控件后,触发清除以重置索引。

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2011-11-03 02:47:51

我用动态内容做了足够多的工作,所以我已经将这个方法添加到了我的基页类中:

代码语言:javascript
复制
/// <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);
            }
}

它也是递归的。然后这样叫它(如果你自己不拥有这个控件):

代码语言:javascript
复制
DisposeChildControlsOf(panel1);

代码语言:javascript
复制
DisposeControl(myDynamicallyGeneratedControl);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7981296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档