【问题标题】:Do I need to call dispose on ToolStripPanel, ToolStrip, and ToolStripItems?我是否需要在 ToolStripPanel、ToolStrip 和 ToolStripItems 上调用 dispose?
【发布时间】:2012-08-29 16:32:16
【问题描述】:

我在代码中构建了一个ToolStripPanel,我添加了一个ToolStrip,然后添加了几个ToolStripButtons 和ToolStripSeparators。我是否需要手动完成并删除和/或调用 dispose ?也就是说,遍历按钮和分隔符并对它们调用 dispose,然后从 ToolStripPanel 中删除 ToolStrip 并删除 ToolStrip,最后从其父控件中删除 ToolStripPanel 并处理它?

更新

阅读Control.Dispose 的文档,似乎在父母身上调用Dispose 会处置孩子。尚不清楚ToolStripItems 是否是ToolStrip 的正确“子代”,因为您没有将它们添加到ToolStrip.Controls 集合中,而是添加到ToolStrip.Items 集合中。查看ToolStrip.Controls 文档时,它说此属性与此类无关。

ToolStripPanel 相同,因为您不调用ToolStripPanel.Controls.Add(toolstrip) 而是调用ToolStripPanel.Join(toolstrip)

【问题讨论】:

    标签: c# idisposable toolstrip toolstripbutton toolstrippanel


    【解决方案1】:

    是的,ToolStripItem 被视为子项。 ToolStrip.Dispose() 迭代 Items 集合并处理项目。这些项目没有添加到 Controls 集合中,因为它们不是从 Control 派生的类。它们是“无窗口”控件,并使用它们的父级来呈现自己。这使得它们非常便宜。

    ToolStripPanel.Join() 实际上确实将 ToolStrip 添加到 Controls 集合中(ToolStrip 确实从 Control 继承)。它只需要做一件额外的事情,它需要将条带移动到正确的位置。并且有 4 个重载。

    因此不需要额外的工作,处理面板就足以处理其工具条及其项目。

    【讨论】:

    • 谢谢,所以我需要从父控件中删除 ToolStripPanel,然后只处理 ToolStripPanel 吗?或者我什至不需要从父控件中删除它?
    • 只需调用它的 Dispose() 方法就足够了。这会自动将其从其父控件集合中删除。
    【解决方案2】:

    如果您在代码中添加这些组件,则必须手动处理它们或将它们(手动)添加到 components 集合中,它会为您处理它们)。

    如果您使用/在设计器中添加这些控件/组件,则不必手动处理它们。它们将被添加到 components 集合中,该集合将由 Designer 生成的代码处理。该集合处理表单上的所有子项。

    【讨论】:

    • 我无法在我的开发环境中访问设计器。
    • 抱歉,我错过了“in code”方面。我以为我已经包含了手动添加控件的详细信息。我已经更新了答案。
    猜你喜欢
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2013-01-28
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多