2011-11-22 7 views
5

He estado rastreando una pérdida de memoria y la he reducido a una información sobre herramientas asignada en una clase derivada de UserControl.Cómo automatizar la limpieza de la información sobre herramientas en UserControl

La información sobre herramientas está asignado en el asignado en el constructor del control y inicializado en el evento de carga de esta manera: los padres

public class CommonProfile : System.Windows.Forms.UserControl 
{ 
    private ToolTip toolTip1; 

    ... 

    public CommonProfile() 
    { 
     InitializeComponent(); 

     // Create the ToolTip and associate with the Form container. 
     toolTip1 = new ToolTip(this.components); 
    } 

    private void CommonProfile_Load(object sender, System.EventArgs e) 
    { 
     // Set up the delays for the ToolTip. 
     toolTip1.AutoPopDelay = 5000; 
     toolTip1.InitialDelay = 1000; 
     toolTip1.ReshowDelay = 500; 
     // Force the ToolTip text to be displayed whether or not the form is active. 
     toolTip1.ShowAlways = true; 

     // Set up the ToolTip text 
     toolTip1.SetToolTip(this.btnDeleteEntry, "Delete this Profile"); 
     toolTip1.SetToolTip(this.lblProfileType, "Edit this Profile"); 
     toolTip1.SetToolTip(this.lblProfileData, "Edit this Profile"); 
     toolTip1.SetToolTip(this.picFlagForUpdate, "Toggle Flag for Update"); 
    }  
} 

del control tiene una vida útil que supera la vida útil del control. Este control se crea sobre la marcha y se agrega a un control de panel y luego se retira del control del panel.

Descubrí que el miembro Dispose del control no se llamaba, aparentemente porque las referencias a la información sobre herramientas permanecen.

he añadido un método de apagado como esto:

public void Shutdown() 
{ 
    toolTip1.RemoveAll(); 
} 

Al llamar al método de apagado elimina la fuga y botar finalmente se llama.

Desafortunadamente, esta solución requiere que quien utiliza el control recuerde llamar al método de apagado cuando hayan terminado con él.

Me gustaría saber si hay alguna forma de que pueda automatizar esto para que ocurra sin la necesidad de llamar al método de apagado explícitamente.

+0

Supongo que debe llamar a dispose en la información sobre herramientas ya sea en la eliminación de su usercontrol o podría tener una función de limpieza que lo haga por usted, como su método shutDown. – PRR

+0

1. Mira aquí [http://stackoverflow.com/questions/672980/dispose-on-user-controls-really-meant-to-edit-the-designer-cs-file][1] [1]: http://stackoverflow.com/questions/672980/dispose-on-user-controls-really-meant-to-edit-the-designer-cs-file – VMykyt

Respuesta

3

No está mostrando el código de cómo se deshace de su UserControl de su Panel.

Sólo llamaba:

panel1.Controls.Remove(userControl1); 

no va a disponer el UserControl.

es necesario llamar específicamente:

userControl1.Dispose(); 

que también lo eliminará automáticamente de la Panel. En su UserControl, si usted tiene que hacer su propia limpiar, tratar de suscribirse a su propio caso Desechar:

private ToolTip toolTip1; 

public UserControl1() { 
    InitializeComponent(); 
    // tooltip initialization 
    this.Disposed += UserControl1_Disposed; 
} 

private void UserControl1_Disposed(object sender, EventArgs e) { 
    if (toolTip1 != null) 
    toolTip1.Dispose(); 
} 
+0

¡Gracias que funcionó! – Avalanchis

1

también en su método dispose control que necesita llamar explícitamente a disponer en su descripción.

Cuestiones relacionadas