私は、実行時に他のユーザーコントロールを追加するコンテナというユーザーコントロールを持っています。リスト項目をnullに設定する方法C#?
コンテナからすべてのコントロールを削除したいと思いますが、私はcontainer.Controls.Clear()
を行っていますが、私のコントロールはまだメモリに残っています。どうすればそれらをnullにできますか?
私は、実行時に他のユーザーコントロールを追加するコンテナというユーザーコントロールを持っています。リスト項目をnullに設定する方法C#?
コンテナからすべてのコントロールを削除したいと思いますが、私はcontainer.Controls.Clear()
を行っていますが、私のコントロールはまだメモリに残っています。どうすればそれらをnullにできますか?
と仮定パネルは、すべての子コントロールを含む親コントロールなので、すべての子コントロールをループし、それぞれのメソッドを処分呼び出す...あなたの問題を解決するかもしれない
while (panel.Controls.Count > 0)
{
panel.Controls[0].Dispose();
}
クリアメソッドを呼び出すだけで、メモリからではなくコンテナコントロールからコントロールを削除するので、それらを破棄する必要があります。
Clearメソッドを呼び出すと、メモリからコントロールハンドルが削除されません。メモリリークを防ぐには、Disposeメソッドを明示的に呼び出す必要があります。
続きを読む:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx
親コンテナにDispose()
を呼び出すと、その子供たちは、IDisposable
も実装していると仮定して制御します。一般的に言えば、すべてのWinFormsコントロールはIDisposableを実装しているので、これはうまくいくはずです。
WPFコントロールで暗黙的にアンマネージコードが使用されていないため、WPFの場合のように、コントロールにカスタムクリーンアップメソッドを追加する必要があります。メモリリークの最も一般的な原因の1つは、アンタッチされたイベントハンドラです。私は通常、次のような何かを:
public void CleanUp()
{
//detach event handlers
//other cleanup as necessary
}
あなたは、これは仮想作り、ユーザーコントロールが継承する基底クラスに追加した場合、これはそのため、あなたは、単に種類を確認することなく、CleanUp()
を呼び出すことができ、特に便利です。 IDisposableは主に管理されていないリソースをクリーンアップするため、私は個人的にはIDisposableを実装するのではなく、このメソッドが好きです。