在C#中正确处理用户控件和子控件

时间:2010-03-04 09:21:22

标签: user-controls .net-2.0 design-patterns dispose

我们遇到了IDisposable模式的一些问题。在这种情况下,有一个用户控件'ControlA'带有一个FlowLayoutPanel,它包含更多用户控件'ControlB'。

当调用Dispose(bool)时,我检查是否处置为true,如果IsDisposed为false。然后我尝试在FlowLayoutPanel的Controls集合中显式地处理每个ControlB。 但是,如果不循环遍历所有控件,则只有8个中的3个或4个中的2个。

Dispose(bool disposing)
{
  if (disposing)
  {
    if (!IsDisposed)
    {
      //unhook events etc.

      foreach(ControlB ctrl in flowlayoutpanel.Controls)  //<-- there 8 controls
        ctrl.Dispose(); //<-- called 3 times only

      flp.Controls.Clear();
    }
  }
  //make all members null
}

我的问题是:1。为什么会这样? 2.你们处理用户控件和儿童控件的最佳做法和经验是什么?例如。你是否一直取消订阅事件处理程序等等。

谢谢!

1 个答案:

答案 0 :(得分:5)

您不需要手动处理作为正在处理的控件的子控件的控件,即在Controls集合中。父控件将自动处理。

如果您被处置,您必须取消订阅您的范围之外的事件,即那些将保持活着的对象的成员,因为它们将使您保持活着,尽管被处置。您不需要取消订阅正在处理的对象中的事件,例如您的子控件。