0

私は自分のアプリケーションで 2 つのフォームを使用しています。A と B と言うことができます。AI を閉じている間、メモリの問題のためにアプリケーションで予期しない動作が見られることがあります。Form B は、Form B = new Form によってローカルに宣言されたフォームであり、ShowDialog メソッドによって表示されます。フォーム A で base.dispose() を呼び出すと、フォーム B も閉じます。しかし、フォーム B を開いたままにしておく必要があります。助言がありますか ?

ありがとう、アビナフ

4

2 に答える 2

1

フォーム A がフォーム B を所有しているため、これは予想される動作です。

フォーム B の宣言と作成をグローバル リソースとしてアプリに移動し、フォーム A からフォーム B のメソッドをProgram.cs呼び出します。Show()

ShowDialogあなたが説明したシナリオでは意味をなさないモーダルダイアログを意味します。本当にそれが必要な場合は、グローバル所有者を割り当てて、それをShowDialog(owner)

ところで。UI ベースのウォッチドッグ機能を実装しようとするのではなく、メモリの問題の根本原因に焦点を当てます。

于 2012-04-26T07:23:30.967 に答える
0

アプリケーション設定で、シャットダウン モードを定義できます (メインフォームで閉じるか、最後のフォームで閉じる)。最後のフォームで閉じるように設定してみてください。

更新:私は自分で試してみましたが、呼び出し元を閉じました(別のフォームで ShowDialog() を呼び出すフォームもダイアログ自体を閉じます。これは設計によるものだと思います。

ただし、このコードを使用して、ダイアログを作成し、呼び出し元を閉じても、ダイアログは引き続き存在します。

// inside formA
private void button2_Click(object sender, EventArgs e)
{
    var owner = new Form();
    var dialog = new FormB();

    // attach to the dialog.button1.Click event to force a close
    // of the current formA instance.
    // button1.modifiers has (at least) to be set internal
    dialog.button1.Click += (x, y) => this.Close();
    dialog.ShowDialog(owner);

    dialog.Dispose();
    owner.Dispose();
}

ここで FormB の button1 をクリックすると、FormA が閉じ、Form B がまだ存在します。FormA は MainForm ではありません。

于 2012-04-26T08:02:38.820 に答える