0

2つの形式があり、form1からデータを取得する必要があります。コンストラクターform2でパラメーターを使用して、次のようなインスタンスを取得します。form2form1's

public form2(Form form1) {
this.f = form1;
}

そしてform1:

Form form2 = new Form(this);

しかし、form1を閉じたときにform1destructが呼び出されたようです。私の質問は、どうすればこの問題を回避できますか?

編集:私の質問には多くの入力ミスがあります、申し訳ありませんが、修正されました:

2つの形式があり、form2からデータを取得する必要があります。コンストラクターform1でパラメーターを使用して、次のようなインスタンスを取得します。form1form1's

private Form f;
public form2(Form form1) {
this.f = form1;
}

そしてform1:

Form form2 = new Form(this);

しかし、form2を閉じたときにform1デストラクタが呼び出されたようです。私の質問は、どうすればこの問題を回避できますか?

4

3 に答える 3

5

MSDNから:

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

そのため、リソースの廃棄を防ぐためにできることは、フォームを閉じるのではなく非表示にすることだけです。

bool reallyClose;

protected override void OnClosing(CancelEventArgs e)
{
    if (!reallyClose)
    {
        e.Cancel = true;
        Hide();
    }
    base.OnClosing(e);
}

reallyCloseこれにより、フォームを閉じる前に手動でフラグを設定しない限り、フォームが閉じられなくなりますtrue

使い終わったら、必ずフォームを正しく閉じてください。

もう1つのオプションは、Form1から取得する必要のあるデータをフォーム自体から切り離すことです。

于 2012-06-26T17:11:40.617 に答える
0

この場合、form2も閉じられるまで、form1を破棄することはできません。form2がform1への参照を持っている限り、form1は存在し続けます。おそらく、form1が破棄されることに関心があります。form1が閉じられると、それ自体が破棄されます。オブジェクトは引き続き存在しますが、すべての子コントロールと、ウィンドウハンドルや描画オブジェクトなどのシステムオブジェクトが解放されます。フォームが破棄されると、それを再度表示することはできず、そのすべてのコントロールにアクセスできなくなります。破棄されたフォームのビジュアルコンポーネントのいずれかを使用しようとすると、がスローされObjectDisposedExceptionます。フォームの破棄を停止する場合は、フォームを閉じるのではなく、単に非表示にします。ただし、Form2で不要になった場合は、後で閉じる必要があります。そうしないと、メモリとリソースを使い果たしてしまいます。

于 2012-06-26T17:18:36.873 に答える
0

両方のフォームから必要なデータをすべて完全に因数分解する必要があります。これにより、そもそも結合されたフォームコンストラクターの問題を回避できます。

于 2012-06-26T17:41:13.860 に答える