2009-03-26 2 views
1

私は何かを達成するためのウィザードとして機能する.NETのWindowsフォームを持っています。これには、Step1、Step2、Step3の3つのステップが含まれています。

各ステップは、実際にはユーザーコントロールです。メインフォームには、現在のステップを表示するパネルが含まれています。ステップ間で変更する場合:

1)Dispose()メソッドを呼び出して、現在のユーザーコントロールを破棄します。
2)メインフォームパネル
3をクリアし)、次のステップのユーザーコントロールを初期化し、メインパネル

にそれを追加ここで、問題は、ステップ1のユーザ制御は、一の以上のユーザコントロールを含みます。私が最初に実際に別のステップを表示する前にユーザーコントロールを配置する必要があるため配置されたオブジェクトにアクセスできない.NET

"Cannot access disposed object." 

:私は別のステップに変更し、ステップ1に戻ってくるときに、私は次のエラーを取得します。そして、手順1に戻り、手順1でユーザーコントロールを開こうとすると、上記のエラーが発生します。

答えて

1

コントロールのコントロールコレクション内のすべては、コントロールが配置されたときに配置されます。したがって、それらのユーザーコントロールを再利用する必要がある場合は、それらを削除する前に親ユーザーコントロールから削除する必要があります。

実際に次のコントロールを表示する前に、ユーザーコントロールを破棄する必要はありません。ステップを変更すると、メインフォームから削除してメインフォームに配置するだけで済みます。メインフォームが閉じているときは、ユーザーコントロールをリストまたは辞書に入れて、すべて破棄します。

+0

私はコントロールを処分しないというアプローチを試みたとき、私は新しい問題に直面しています。ステップ1に表示されたユーザーコントロールを呼び出すイベントが2回呼び出されます。理由を教えてもらえますか? –

+0

私はちょうど2回ではないことに気がつきました。何度も何度も呼ばれて、私は別のステップにスウィッチし、ステップ1に戻ります。 –

1

なぜユーザーコントロールを破棄する必要がありますか?通常、フォームが終了すると、フォームのすべての子コントロールが破棄されます。

オブジェクトに対してdisposeを呼び出すと、本質的にはそれが消え去るように伝えられます。あなたはもうそれを望んでいません。心が変わることはありません。いったん処分されると、消えてしまいます。もう使用しないでください。

通常、オブジェクトに対して直接disposeを呼び出さないでください。オブジェクトを再度必要とする前にオブジェクトを破棄しないようにするために、そしてオブジェクトが処理された後にオブジェクトが確実に破棄されるように、「使用する」パターンを使用する必要があります。

関連する問題