グーグルとスタックオーバーフローを検索した後、私の状況で役立つ答えが見つかりません。スタート メニュー (フォーム) を備えたアプリケーションがあります。ユーザーが(任意の)フォームのX(閉じる)を押すと、スタートメニューがリロードされます。その(メニュー)フォームが閉じられたときに、ユーザーがキャンセルを押した場合、現在非表示になっているフォームが編集モード(未保存の変更の有無にかかわらず)であるかどうかを確認してユーザーに通知したいそのフォームを表示し、アプリケーションが閉じないようにします。今私の問題は、アプリケーションが他のフォームのコードで停止するのをどのように停止するかです。this.close を呼び出すサブフォームの dispose メソッドをオーバーライドしているため、ok/cancel メッセージボックスが表示されますが、MB の後でスタート メニューが閉じてプログラムが停止します。
編集:ここでは、呼び出される順序でコードの一部を示します。どこが間違っていますか?
private void Menu_FormClosing(object sender, FormClosingEventArgs e)
{
Global.Forms.Remove(this);
if (!Global.Clean_Forms())
{
e.Cancel = true;
Global.Forms.Add(this);
}
}
public static void Clean_Forms()
{
foreach (Form f in Forms)
{
if (f is Menu)
{
//do nothing
}
else
{
if (!f.IsDisposed)
{
f.Close();
}
}
}
if (Forms.Count != 0)
{
isClean = false;
/* String a = "";
foreach (Form f in Forms)
{
a += f.ToString() + ": ";
}
MessageBox.Show(a);*/
}
else
{
isClean = true;
}
}
しかし、これはうまくいきません。アプリケーションはただ閉じます。
ランダム形式のクロージング イベント ハンドラ
private void persoon_form_FormClosing(object sender, FormClosingEventArgs e)
{
if (editing)
{
DialogResult dr;
dr = MessageBox.Show("uw wijzigingen gaan verloren. Doorgaan?", "sluiten", MessageBoxButtons.OKCancel);
if (dr == DialogResult.Cancel)
{
e.Cancel = true;
}
else if (dr == DialogResult.OK)
{
Global.size = this.Size;
Global.position = this.Location;
Global.Forms.Remove(this);
Form f = Global.menu();
f.Show();
this.Dispose();
}
}//somethingelse}
編集: @cody gray が onclose に変更され、clean_form はまだ効果がありません。