5

これは問題のコードです:

    private void FormAccounting_FormClosing(object sender, FormClosingEventArgs e)
    {
        Properties.Settings.Default.FormAccountingLocation = this.Location;
        Properties.Settings.Default.Save();
        if (IsEditing)
        {
            MessageBox.Show("Please save or cancel open transactions before closing the accounting window.", "Open Transactions", MessageBoxButtons.OK, MessageBoxIcon.Information);
            e.Cancel = true;
        }
    }

行にブレークポイントを追加して、e.Cancel = true;確実に実行されるようにしました。

[OK] をクリックすると、すぐにフォームが閉じます。

FormAccounting を呼び出すコードは次のとおりです。

    private void buttonAccounts_Click(object sender, EventArgs e)
    {
        FormAccounting NewFormAccounting = new FormAccounting();
        NewFormAccounting.Show();
    }
4

1 に答える 1

13

フォームのクローズイベントをキャンセルすると、次のことが防止されます。

  1. フォームを閉じるユーザー
  2. アプリケーション:アプリケーションの終了を終了します
  3. Form.Closeを呼び出すことからのコード

しかし、それを防ぐためには機能しません:

  1. アプリケーションのメインフォームを閉じるユーザー
  2. フォームを呼び出すコード。フォームに破棄
  3. Formを呼び出すコード。アプリケーションのメインウィンドウで閉じる

最後の3つのケースでは、メイン以外のフォームでフォームのクローズイベントがトリガーされないため、フォームはキャンセルされることなく消えます。おそらく、アプリケーションによって、最初の3つの方法のいずれかでフォームが閉じられてイベントがトリガーされ、次に次の3つの方法のいずれか(または同様の方法)でイベントがトリガーされず、フォームが強制的に閉じられます。 。

編集: この関数をフォームのコードに追加すると、ウィンドウが閉じられたときにコールスタックがどのように表示されるかをデバッガーで確認できるため、実際に何が原因であるかを確認できます。

  protected override void DestroyHandle()
  {
     System.Diagnostics.Debugger.Break();
     base.DestroyHandle();
  }
于 2011-08-17T11:38:12.647 に答える