2011-11-22 12 views
5

Ho rintracciato una perdita di memoria e l'ho ridotta a un ToolTip assegnato in una classe derivata da UserControl.Come automatizzare la pulizia di ToolTip in UserControl

La finestra a scomparsa viene allocato nel allocato nel costruttore del controllo e inizializzato nell'evento Load simili: genitore

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 controllo ha una durata che supera durata del controllo. Questo controllo viene creato al volo e aggiunto a un controllo del pannello e successivamente rimosso dal controllo del pannello.

Ho trovato che il membro Dispose del controllo non è stato chiamato, apparentemente perché i riferimenti a ToolTip rimangono.

ho aggiunto un metodo Shutdown come questo:

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

chiamata al metodo Shutdown elimina la perdita e Dispose viene infine chiamato.

Sfortunatamente, questa soluzione richiede che chiunque utilizzi il controllo si ricordi di chiamare il metodo Shutdown quando ha finito con esso.

Mi piacerebbe sapere se è possibile automatizzarlo in qualche modo in modo che avvenga senza la necessità di chiamare esplicitamente il metodo di spegnimento.

+0

Immagino che sia necessario chiamare il tooltip sia nel deploy del tuo usercontrol, sia che tu possa avere una funzione clean up che lo fa per te, come il tuo metodo shutDown. – PRR

+0

1. Guardate qui [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

risposta

3

Non si sta visualizzando il codice per come si smaltisce il UserControl dal proprio Panel.

Basta chiamare:

panel1.Controls.Remove(userControl1); 

non sta per smaltire il UserControl.

è necessario chiamare in particolare:

userControl1.Dispose(); 

che sarà anche rimuovere automaticamente dal Panel. Nella tua UserControl, se avete bisogno di fare la propria pulire, provare la sottoscrizione di essa la propria manifestazione Smaltire:

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

Grazie che ha funzionato! – Avalanchis

1

anche nel metodo dispose di controllo è necessario chiamare in modo esplicito smaltire sul tooltip.