私はWinForms C#プログラムを作成しています。フォームを閉じるときのC#ArgumentOutOfRangeException
メインフォーム以外のすべてのフォーム(FrmMain
)を閉鎖しようとしています。
メインフォームを非表示にする必要があります。
私はこれを2つの形式を開いて作成しました。 1つは私のメインフォームで、もう1つはShowDialog()
メソッドで表示された別のフォームです。
このコードを自分のマシン上で実行すると、すべてのフォームを適切に閉じる必要があるようです。何らかの理由で、ブレークポイントを設定せずにこの特定のコードを実行すると、変数i
が-1
になるため、ArgumentOutOfRangeException
が返されます。私がブレークポイントを設定し、コードの各部分をゆっくりと進めるとうまく動作します。
私はi >= 0
の条件があるので、i
が-1
に到達するためにforループが途中まで続くことは意味がありません。 i
のインデックスは、私がブレークポイントを使用していないとき-1
になりますが、私は、ブレークポイントを使用して、個別にループの各行をステップ実行していたときに0
になる理由
誰かが私に説明できますか?
これを修正するにはどうすればよいですか?
ありがとうございます。
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
if (Application.OpenForms[i] is FrmMain)
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i]?.Hide();
});
}
else
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i]?.Dispose();
});
}
}
編集:私は例外ArgumentOutOfRangeExceptionを取得防止
方法は、のためにループ内で別の変数を追加することです。 これは私が変更したコードです。条件がfalseの場合
for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
int i1 = i;
if (Application.OpenForms[i] is FrmMain)
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i1]?.Hide();
});
}
else
{
Application.OpenForms[i]?.BeginInvoke((MethodInvoker)delegate
{
Application.OpenForms[i1]?.Dispose();
});
}
}
検索用語「C#の閉鎖のための」 –
、そしてあなたは、このコードを呼び出すん回数:
あなたはここで撮影した変数を知ることができますか? –
@AfshinAghazadeh新しいスレッドでクラス内で一度しか呼び出されない – Ben