2011-11-22 13 views
5

私はメモリリークを追跡しており、UserControlから派生したクラスに割り当てられているツールチップに絞っています。UserControlでツールチップのクリーンアップを自動化する方法

ツールチップがコントロールのコンストラクタに割り当てられ、このようなLoadイベントで初期化に割り当てられている:

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"); 
    }  
} 

コントロールの親コントロールの有効期間を超える寿命を有します。このコントロールはオンザフライで作成され、パネルコントロールに追加された後、パネルコントロールから削除されます。

コントロールのDisposeメンバーが呼び出されていないことがわかりました。明らかに、ツールヒントへの参照が残っているためです。シャットダウンメソッドを呼び出す

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

漏れがなくなり、処分が最終的に呼び出されます。

は、私はこのようなシャットダウン方法を追加しました。

残念ながら、このソリューションでは、コントロールを使用している人は誰でも、終了時にShutdownメソッドを呼び出すように覚えておく必要があります。

シャットダウンメソッドを明示的に呼び出す必要がないように自動化できる方法があるかどうかを知りたいと思います。

+0

私は、あなたのusercontrolを破棄するか、あなたのシャットダウンメソッドのような、あなたのためにそれを行うクリーンアップ機能を持つことができるかのいずれかでツールチップを呼ぶ必要があると思います。ここ – PRR

+0

1.ルック[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

答えて

3

UserControlの処分方法のコードは、Panelから表示されていません。

だけ呼び出す:

panel1.Controls.Remove(userControl1); 

UserControlを処分するつもりはありません。

あなたは、具体的コールする必要があります。また、自動的にPanelから削除されます

userControl1.Dispose(); 

を。あなたのUserControlで、あなたはそれ自身の処分のイベントに加入しようと、クリーンアップあなた自身を行う必要がある場合:

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

ありがとうございました! – Avalanchis

1

はまた、あなたのコントロールのDisposeメソッドで明示的にあなたのツールチップに処分呼び出す必要があります。

関連する問題