2011-08-09 10 views
4

通常のPanelコントロールには、ユーザーコントロールが多数含まれています。コンテナを更新せずにコンテナからコントロールを削除する方法

panel.Controls.Clear();

が、これは、私は(すぐにとはいえ)個別に消えて各コントロールを参照してください効果があります。現時点では、私は、次の手順を実行します。

SuspendLayoutおよびResumeLayoutを使用すると、顕著な効果はありません。

質問:すべてのコントロールを削除して、すべての子コントロールが削除されたときにのみコンテナを更新する方法はありますか?

編集:私が削除しているコントロールはUserControlから派生しているので、いくつかの描画動作を制御できます。それらが削除されるときに更新を防ぐために私がオーバーライドすることができるいくつかの機能はありますか?

+3

これを行うと、ウィンドウがリークしています。はい、しばらくするとかなり遅くなります。代わりにwhile(panel.Controls.Count> 0)panel.Controls [0] .Dispose();を使用してください。まだ遅い場合は、パネルのVisibleプロパティを最初にfalseに設定します。 –

+0

@ HansPassant +1 Greeeeeeat !!!それはトリックでした! – equisde

答えて

5

あなたの提案に感謝します - はい、それはでしたコントロールが漏れていました。

は、ここに私がやってしまったものです:

panel.Visible = false; 

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

panel.Visible = true; 

を基本的に、私は、各コントロールを処分する前に(ボーダーレスである)パネル全体を非表示にします。各コントロールを破棄すると、そのコントロールが親コンテナから自動的に削除されます。最後に、もう一度コンテナを見えるようにします。

0

ダブルバッファリングが必要だと思います。子供が削除されるよう

は、コントロールの再描画 Enabling Double Buffering

How do I enable double-buffering of a control using C# (Windows forms)?

SuspendLayout SO

Winforms Double Bufferingのように、すでにこのに関するいくつかの答えがあり停止しているが、それらのアクションは、 ResumeLayoutに電話すると、順番に処理されます。ダブルバッファリングは、オフスクリーンバッファが更新されるまでコントロールペインティングをまったく停止します。更新は速く行われることはありませんが、バッファからすべて一度に画面にレンダリングされます。マシンが非常に遅い場合は、画像をロードするときと同じように、バッファが画面にレンダリングされてもちらつきが残ることがあります。

+0

私はダブルバッファリングに精通しています。これは原因の問題ではなく、問題の症状に対処するだけです。この場合、子コントロールが削除されるときに実際に子コントロールが描画されないようにしたいです。ダブルバッファリングはこの図面をユーザーに隠す*だけです。 –

+0

コントロールをサブクラス化し、おそらく 'OnPaint'をオーバーライドすることができます。 – Jodrell