2

グーグルとスタックオーバーフローを検索した後、私の状況で役立つ答えが見つかりません。スタート メニュー (フォーム) を備えたアプリケーションがあります。ユーザーが(任意の)フォームの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 はまだ効果がありません。

4

2 に答える 2

7

Disposeメソッドでこれを行うべきではありません。代わりに、FormClosingイベントを処理してみてください。

このイベントはフォームが閉じられるに発生するため、必要な状態を確認し、必要に応じe.Cancelて True に設定して閉じることをキャンセルできます。

例えば:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    // Check to see if the user is allowed to close this form
    if (!allowClose)
    {
       // Prevent this form from being closed
       MessageBox.Show("This form cannot be closed yet!");
       e.Cancel = true;
    }
}
于 2011-02-28T10:31:22.613 に答える
0

私はそれを理解したと思います!私は2つのことを変えました。1 this.dispose を呼び出していないことを確認しました。これは、子フォームを破棄する (閉じない) ことになるため、onclothing イベントは呼び出されません。2. 生成されたコレクションをメイン メニューで閉じることができるかどうかを確認するときの foreach ループでエラーが修正されました。だからこれで、正しい方向に私を向けてくれたコーディ・グレイが正しい順序で閉じることを確認しました:

Stack<Form> stack = new Stack<Form>();
            foreach (Form f in Forms)
            {
                if (f is Menu)
                {
                    //do nothing
                }
                else
                {
                    if (!f.IsDisposed)
                    {


                        stack.Push(f);
                    }

                }

            }
            for (int i = 0; i < stack.Count; i++)
            {
                Form temp = stack.Pop();
                temp.Close();
            }
于 2011-02-28T13:13:50.850 に答える