2008-10-03 11 views
57

Tengo una clase que implementa UserControl. En .NET 2005, un método Dispose se crea automáticamente en el archivo de clase parcial MyClass.Designer.cs que tiene este aspecto:¿Cómo agrego la funcionalidad Dispose a un C# UserControl?

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

Si quiero añadir mi propia funcionalidad botar, donde habría decirlo? Dado que se genera este archivo, no quiero agregar código aquí y arriesgarme a que se deslumbre.

Respuesta

49

En tal caso muevo el método Dispose generado al archivo principal y lo extiendo. Visual Studio respeta esto.

Otro enfoque sería usar un método parcial (C# 3.0).

+3

Un método parcial no funciona en este escenario. – Micah

+0

El método Dispose en el archivo Designer podría extenderse para incluir una llamada a un método parcial, que puede implementarse en el archivo principal. –

+9

Como el archivo MyClass.Designer.cs ya es un archivo parcial, simplemente puede agregar la lógica necesaria al método Dispose ya generado. Visual Studio no sobrescribirá el método una vez que se haya creado para que pueda modificarlo con seguridad. –

7

Creo que en este caso el generador de código rinde homenaje a su código. Debería ser seguro ponerlo en el código subyacente.

6

En VS 2005 (y 2008) puede actualizar el método Dispose y no se eliminará cuando edite el control del diseñador.

2

Puede moverlo desde el archivo .designer.cs al archivo .cs principal si lo desea. Como ya se dijo, no se sobrescribirá.

63

Todas las clases Component implementan un evento Disposed. Puede agregar un controlador de eventos para ese evento y limpiar cosas allí.

Por ejemplo, en su UserControl Se podría añadir siguiente método:

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

Y en el constructor (o en Load controlador de eventos) añadir la siguiente línea:

Disposed += OnDispose; 
+2

@Jacob Seleznev: No estoy seguro de por qué más personas no votaron a favor de esto. Quizás ellos no lo vieron? Considero que el evento Disposed es la forma correcta de agregar funcionalidad de eliminación a cualquier clase que lo soporte. – supercat

+1

+1 - Estoy de acuerdo con supercat que esto es mejor que la respuesta aceptada actual. – Joe

+4

Creo que los eventos se deben manejar desde fuera de la clase, no desde adentro. Supongo que cualquiera puede sobrescribir el controlador de eventos con el suyo y evitar que se liberen los recursos. La forma correcta de manejar asuntos internos de un control es anular un método virtual adecuado proporcionado por la clase base. – Spook

2

Sólo tiene que sobrecargar el método public void Dispose() en la clase de componente que hereda el control del usuario.

asegurarse de que pase la llamada al método de base, así como hacer tu disponer funcionalmente o tendrá que romper la funcionalidad a menos que implemente plenamente

+1

Esta es una gran idea. Para cada subclase implementada por Microsoft de 'System.Windows.Forms.Control' que necesita más control sobre' Dispose (bool disposing) ', puede subclasificar y anular' Dispose' allí, agregando una llamada a algún 'DisposeCore' virtual. método como se describe en [la respuesta de otra pregunta] (http://stackoverflow.com/a/673304/429091). Puede leer el valor del parámetro 'disposing' * y * aún así evitar editar los archivos del diseñador. Ganar/ganar – binki

-2

hay un evento en vacío para el control de usuario que se puede utilizar para limpiar,

+3

Esta pregunta se trata de un UserControl de WinForms, que * no * tiene un evento 'Descargar '. ¿Quizás te refieres a un control WPF o Silverlight? –

0

Creo que la manera más limpia sería tener su control suscribirse a su propio evento Disposed() y hacer su limpieza allí.

Cuestiones relacionadas