2012-05-07 14 views
4

私は、実行時に他のユーザーコントロールを追加するコンテナというユーザーコントロールを持っています。リスト項目をnullに設定する方法C#?

コンテナからすべてのコントロールを削除したいと思いますが、私はcontainer.Controls.Clear()を行っていますが、私のコントロールはまだメモリに残っています。どうすればそれらをnullにできますか?

答えて

4

と仮定パネルは、すべての子コントロールを含む親コントロールなので、すべての子コントロールをループし、それぞれのメソッドを処分呼び出す...あなたの問題を解決するかもしれない

while (panel.Controls.Count > 0) 
    { 
    panel.Controls[0].Dispose(); 
    } 

クリアメソッドを呼び出すだけで、メモリからではなくコンテナコントロールからコントロールを削除するので、それらを破棄する必要があります。

1

親コンテナにDispose()を呼び出すと、その子供たちは、IDisposableも実装していると仮定して制御します。一般的に言えば、すべてのWinFormsコントロールはIDisposableを実装しているので、これはうまくいくはずです。

WPFコントロールで暗黙的にアンマネージコードが使用されていないため、WPFの場合のように、コントロールにカスタムクリーンアップメソッドを追加する必要があります。メモリリークの最も一般的な原因の1つは、アンタッチされたイベントハンドラです。私は通常、次のような何かを:

public void CleanUp() 
{ 
    //detach event handlers 
    //other cleanup as necessary 
} 

あなたは、これは仮想作り、ユーザーコントロールが継承する基底クラスに追加した場合、これはそのため、あなたは、単に種類を確認することなく、CleanUp()を呼び出すことができ、特に便利です。 IDisposableは主に管理されていないリソースをクリーンアップするため、私は個人的にはIDisposableを実装するのではなく、このメソッドが好きです。

関連する問題