Правильное размещение пользовательских и дочерних элементов управления в C # - PullRequest
2 голосов
/ 04 марта 2010

у нас возникло несколько проблем с шаблоном IDisposable. В этом случае есть пользовательский элемент управления «ControlA» с FlowLayoutPanel, который содержит больше пользовательских элементов управления «ControlB».

При вызове Dispose (bool) я проверяю, удаляет ли утилита значение true и имеет ли IsDisposed значение false. Затем я пытаюсь явно расположить каждый ControlB в коллекции Controls FlowLayoutPanel. Однако, если не проходит через все элементы управления, только 3 из 8 или 2 из 4.

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 Ответ

5 голосов
/ 04 марта 2010

Вам не нужно вручную располагать элементы управления, которые являются дочерними элементами управления расположенного элемента управления, т.е. находятся в коллекции Controls. Родительский элемент управления будет обрабатывать это автоматически.

Если вы утилизируете, вы должны отказаться от подписки на события, которые находятся за пределами вашей области, то есть являются членами объектов, которые останутся в живых, потому что в противном случае они также будут поддерживать вас в живых, несмотря на то, что их выбрасывают. Вам не нужно отписываться от событий в объектах, которые также удаляются, например, ваши дочерние элементы управления.

...