2

ログアウト機能が必要な Windows アプリケーションがあります。ログインページがないため、ログアウトでログインページにアプリケーションがスローされることは望ましくありません。ログインは、メイン ページの単なるパネルです。

次のコードを試しましたが、このエラーがスローされます。

エラー: コレクションが変更されました。列挙操作は実行されない可能性があります。

private void mnulogout_Click(object sender, EventArgs e)
        {
            DialogResult dialogresult=MessageBox.Show("Do You Want To LogOut?","LogOut",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dialogresult == DialogResult.Yes)
            {
                foreach (Form fm in Application.OpenForms)
                {
                    fm.Close();
                }
            }
        }
4

3 に答える 3

1

Close問題は、反復しているコンテナーの要素を呼び出していることです。このコンテナーには開いているフォームしか含まれていないため、メソッドを呼び出すとフォームがコンテナーから削除され、Close反復中にコンテナーが変更されます。C# はこれを好みません。

これを修正するには、コンテナーのコピーを作成し、このコピーを反復処理します。

List openFormsCopy = new List(Application.OpenForms);
foreach (Form fm in openFormsCopy)
{
    fm.Close();
}

これは、問題の C# 部分にのみ回答することに注意してください。他の回答者の中には、とにかく間違ったコレクションを繰り返し処理していると示唆している人もいます。私は WinForms に詳しくないので、それについてコメントすることはできませんが、調べてみてください。

于 2013-06-21T06:34:11.363 に答える