0

私はObjectDisposedException was unhandledメッセージで取得していますCannot access a disposed object.

これは、クラスの先頭でこの子フォームを初期化しMyForm myForm = new MyForm();、そのフォームのテキストボックスにテキストを追加してから、myForm.txtBox.AppendText("Text");コード付きのボタンを使用して新しいフォームを開くと発生しますmyForm.Show();。仕事が終わったら、フォームを閉じることができます。今、データを再度表示したいときに、その例外が発生しています。

テキスト ボックスの内容を新しいフォームに保持したいのですが、すべてを破棄していないという問題があるようです。

これを回避して、ボタンを押すたびに新しいフォームのコンテンツを表示できるようにするにはどうすればよいですか?

4

3 に答える 3

3

次の MSDN ドキュメントからForm.Close:

フォームが閉じられると、オブジェクト内で作成されたすべてのリソースが閉じられ、フォームが破棄されます。Closing イベントを処理し、パラメーターとしてイベント ハンドラーに渡された CancelEventArgs の Cancel プロパティを設定することにより、実行時にフォームが閉じないようにすることができます。閉じようとしているフォームがアプリケーションのスタートアップ フォームである場合、アプリケーションは終了します。

フォームでイベントをキャプチャし、Form.Closingイベントをキャンセルして、フォームを非表示にCloseすることができます。

于 2012-01-22T01:50:12.970 に答える
1

M.Babcock が言ったように、FormClosing イベントをキャプチャする必要がありますが、クローズの理由を確認することもお勧めします。ユーザーが要求した場合は、キャンセルして好きなことを行うことができます:private

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true;

        // Make your form dissappear of whatever you want
    }
}

そうしないと、必要に応じて閉じることができません。

于 2012-01-22T02:41:39.167 に答える
1

問題は、クラスの開始時に のインスタンスを作成しMyForm、ボタンが押されるたびにそれを再利用していることにあるようです。残念ながら、それはうまくいきません。フォームが閉じられると、そのフォームは破棄されるため、有効ではなくなります。次に表示しようとするとスローされます。

これを回避する最も簡単な方法は、フォーム全体をボタン クリック イベント内に作成して表示することです。クリック間でインスタンスを再利用しないでください。

void OnButtonClick(object sender, EventArgs e) {
  using (MyForm myForm = new MyForm()) {
    myForm.txtBox.AppendText("Test");
    myForm.ShowDialog(this);
  }
}

テキストなど、クリック間で保持する必要がある状態がある場合は、それを保存しますが、Formインスタンスは保存しません。

于 2012-01-22T01:59:14.217 に答える