【问题标题】:Remove TabPage: Dispose or Clear or both?删除 TabPage:Dispose 或 Clear 或两者兼而有之?
【发布时间】:2010-12-17 22:41:39
【问题描述】:

我正在开发一个具有名为 tabDocuments 的 TabControl 的 Windows 窗体。我遇到了从 TabControl 中删除所有页面的这段代码。

for (int i = tabDocuments.TabPages.Count - 1; i > -1; i--) {
    tabDocuments.TabPages[i].Dispose();
}
    tabDocuments.TabPages.Clear();

编写此代码的人已经离开了一段时间。我试图理解为什么代码在处理每个 tabPages 后调用 Clear() (对我来说看起来没有必要)。谁能向我解释为什么?还是额外调用 Clear()?

【问题讨论】:

    标签: c# .net winforms tabcontrol


    【解决方案1】:

    在每个标签页上调用 Dispose() 实际上并没有将它们从 TabPages 集合中删除,它只是将它们释放。对 Clear() 的调用将它们从集合中删除。如果您不调用 Clear(),它们仍然会在那里,并且很可能会发生不好的事情,因为您最终会在它们被处理后尝试使用它们。

    【讨论】:

    • 根据我的实验,处理一个标签页会将其从 TabControl 中删除
    • 这太令人惊讶了!我没有意识到这一点。
    • 即使是,也不应该将 at 用作代码模式,它可能会导致其他 Disposable 对象出现错误。
    • @Marty 在创建示例项目并尝试之前我也不知道这一点:)。
    • 你的回答很有道理。根据文档所说的方法将执行的操作。但是,由于 Dispose 方法具有其他未记录的功能(不是错误,只是未记录),因此 clear 调用并非完全必要,但在我看来仍然是一种很好的做法。
    【解决方案2】:

    首先从集合中删除一个 Tab,然后是 Dispose()。永远不要 Dispose() 仍在使用的东西,因为它会导致异常和奇怪的行为。

    另外,确保没有其他人对选项卡有引用,否则这些引用将在 Dispose() 上无效。

    【讨论】:

    • 所有控件不都是这样吗?这就是 IsDisposed 属性存在的原因...
    • 通常您不会 Dispose 控件,它们存在于整个应用程序中,并且不会保留关键的非托管资源。您可能希望将表单用作一次性对话框。然后表单将释放其控件。
    【解决方案3】:

    这个 sn-p 来自 Control.Dispose:

            if (this.parent != null)
            {
                this.parent.Controls.Remove(this);
            }
    

    因此您只需调用 Dispose,而不是 Clear。

    【讨论】:

    • 谢谢,您在哪里找到 Control.Dispose 的 sn-p?
    • @Xaero,虽然,您对控件从其父级中删除自己是正确的。您只是碰巧通过拆卸组件才知道这一点。该方法的公共文档中没有任何地方说它将自己从父级中删除。在框架的未来版本中可以更改此功能。我知道调用程序集可以针对特定版本的 .NET 框架。但是,根据公共文档调用方法不是更好的做法(即使没有必要)。
    猜你喜欢
    • 2011-06-17
    • 2015-10-14
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多