Как добавить функциональность Dispose в C # UserControl? - PullRequest
58 голосов
/ 03 октября 2008

У меня есть класс, который реализует UserControl. В .NET 2005 метод Dispose автоматически создается в файле частичного класса MyClass.Designer.cs, который выглядит следующим образом:

  protected override void Dispose(bool disposing)
  {
     if (disposing && (components != null))
     {
        components.Dispose();
     }
     base.Dispose(disposing);
  }

Если я хочу добавить свою собственную функцию Dispose, где бы я ее разместил? Поскольку этот файл сгенерирован, я не хочу добавлять сюда код и рисковать его уничтожением.

Ответы [ 8 ]

66 голосов
/ 01 декабря 2008

Все Component классы реализуют событие Disposed. Вы можете добавить обработчик события для этого события и очистить его там.

Например, в вашем UserControl вы можете добавить следующий метод:

private void OnDispose(object sender, EventArgs e)
{
    // do stuff on dispose
}

И в конструкторе (или в Load обработчике событий) добавьте следующую строку:

Disposed += OnDispose;
53 голосов
/ 03 октября 2008

В этом случае я перемещаю сгенерированный метод Dispose в основной файл и расширяю его. Visual Studio уважает это.

Другой подход заключается в использовании частичного метода (C # 3.0).

7 голосов
/ 03 октября 2008

Я считаю, что в этом случае генератор кода уважает ваш код. Должно быть безопасно поместить его в коде позади.

6 голосов
/ 03 октября 2008

В VS 2005 (и 2008) вы можете обновить метод Dispose и он не будет удален при редактировании элемента управления из конструктора.

2 голосов
/ 22 апреля 2009

Вам просто нужно перегрузить открытый метод void Dispose () в классе компонентов, который наследует пользовательский элемент управления.

убедитесь, что вы передаете вызов базовому методу, а также выполняете утилизацию функционально, иначе вы нарушите функциональность, если не полностью реализуете его

2 голосов
/ 03 октября 2008

Вы можете переместить его из файла .designer.cs в основной файл .cs, если хотите. Как уже было сказано, оно не будет перезаписано.

0 голосов
/ 13 июня 2017

Я думаю, что самым чистым способом было бы, чтобы ваш элемент управления подписывался на свое собственное событие Disposed () и выполнял там очистку.

0 голосов
/ 25 мая 2012

есть событие Unloaded для UserControl, которое вы можете использовать для очистки,

...