2008-10-03 5 views
57

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

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

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

ответ

49

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

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

+3

Частичный метод не работает в этом сценарии. – Micah

+0

Метод Dispose в файле Designer может быть расширен для включения вызова частичного метода, который может быть реализован в основном файле. –

+9

Поскольку файл MyClass.Designer.cs уже является частичным файлом, вы можете просто добавить необходимую логику к уже созданному методу Dispose. Visual Studio не будет перезаписывать метод после его создания, поэтому вы можете его изменить. –

7

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

6

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

2

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

63

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

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

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

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

Disposed += OnDispose; 
+2

@Jacob Seleznev: Не знаю, почему больше людей не поддержали это. Может, они этого не видели? Я считаю событие Disposed правильным способом добавления функций удаления в любой класс, который его поддерживает. – supercat

+1

+1 - Я согласен с supercat, что это лучше, чем текущий принятый ответ. – Joe

+4

Я считаю, что события должны обрабатываться вне класса, а не изнутри. Я предполагаю, что любой может перезаписать обработчик событий своим собственным и предотвратить освобождение ресурсов. Правильный способ обработки внутренних элементов элемента управления - переопределить правильный виртуальный метод, предоставляемый базовым классом. – Spook

2

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

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

+1

Это отличная идея. Для каждого внедренного Microsoft подкласса System.Windows.Forms.Control' вам нужно больше контроля над 'Dispose (bool disposing)', вы можете подклассифицировать его и переопределить 'Dispose' там, добавив вызов к некоторому виртуальному' DisposeCore' метод, описанный в [ответе другого вопроса] (http://stackoverflow.com/a/673304/429091). Вы можете прочитать значение параметра 'disposing' * и *, тем не менее, избегать редактирования файлов конструктора. Win/выигрыш. – binki

-2

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

+3

Этот вопрос касается WinForms UserControl, который * не имеет * событие 'Unloaded'. Возможно, вы имеете в виду элемент управления WPF или Silverlight? –

0

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