【问题标题】:C# Not Disposing controls like I told it toC# 没有像我说的那样处理控件
【发布时间】:2009-09-29 15:28:11
【问题描述】:

我有一个面板控件。在面板内,用户可以添加组合框、文本框的标签等并拖动它们等等,我的表单上有一个删除按钮,如果他们点击它,它将删除该面板内的所有控件。但是这段代码:

foreach( Control control in panel.Controls )
{
     control.Dispose();
}

... 无法正常工作。它并不总是处理面板内的所有控件。有时它会摆脱其中的大部分,有时它只会摆脱一两个。有时除了 1 之外的所有内容都已处置。什么鬼?

编辑:


这是我用来将控件添加到面板的代码:
button1_Click(object sender, EventArgs e)
{
    TextBox tbox = new TextBox();
    tbox.Multiline = true;
    tbox.IsAccessible = true;

    panel.Controls.Add(tbox);
}

【问题讨论】:

  • 我认为你的问题出在代码的其他地方。
  • 我将使用用于创建控件的代码来编辑我的问题。
  • 我同意 Dan Herbert 的回答。我认为您对调用 dispose 的作用有根本的误解。
  • 我以为你的意思是“WPF”而不是“WTF”,但我猜你第一次就猜对了。 :)
  • 调用Dispose实际上并不一定会做任何事情,当然也不一定会导致控件关闭或消失。

标签: c# winforms foreach dispose


【解决方案1】:

Dispose() 仅清理非托管资源(尽管 Paul Williams 在 cmets 中指出它通常比这更复杂!)因此它可能会或可能不会对您的情况做任何有用的事情。

尝试使用RemoveAt(i) 方法删除控件,而不是Dispose()

for(int i = panel.Controls.Count-1; i >= 0; i--)
{
    panel.Controls.RemoveAt(i);
}

【讨论】:

  • 如果你想全部删除它们,你可以使用 panel.Controls.Clear() 。如有必要,Control.ControlCollection 将负责清理。
  • 一个适当的重写 Dispose(boolean) 方法处理托管和非托管资源。 Dispose(true) 意味着同时处理两者。 Dispose(false) 意味着你有一个终结器,终结器称为 Dispose 方法。如果从终结器调用,则 Dispose 方法不得触及任何其他托管对象。为时已晚。
【解决方案2】:

删除所有控件的更简单方法是这样做:

panel.Controls.Clear();

编辑:感谢 Pieter 和 Paolo,像这样调用 Clear() 会泄漏内存,因为控件没有被释放,所以这不是一个好习惯。

【讨论】:

  • 请注意,这不会释放您的控件。它只会将它们从集合中删除。
  • @Pieter:还请注意,并非每个控件都需要调用 Dispose() ,我猜这就是您所说的。否则,从控件集合中删除它们将它们暴露给垃圾收集,假设它们没有在其他地方也被引用。看来 OP 最初只是基于对如何“删除”控件的误解才使用 Dispose()。
  • @MusiGenesis MSDN 明确表示:调用Clear 方法不会从内存中删除控制句柄。 您必须显式调用Dispose 方法以避免内存泄漏
【解决方案3】:

我以前见过这种情况,您正在从集合中删除使集合本身更小的项目。 例如,如果集合中有 5 个项目,当您向下移动时,您会比您预期的更快到达列表末尾,因为您发出的每个 Dispose() 列表都会变小。

【讨论】:

  • 不确定这是否适用于 foreach 循环。
  • 非常感谢 Darrin。我明白现在发生了什么。再次感谢。 :)
【解决方案4】:

我知道这是一个很老的帖子,但我希望能对某人有所帮助。

我发现唯一可行的方法是:

while(panel.Controls.Count > 0)
{
    panel.Controls[0].Dispose();
}

这样,如果控件列表在循环中间变小,则无关紧要。

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 2022-10-24
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多