- PR -

System.InvalidOperationException の初回例外とは

1
投稿者投稿内容
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2008-02-26 18:25
 こんばんは。
1つお聞きします。

VB6.0のプロジェクトを2005にコンバートしましたら

Private Sub Exit_Application()
Dim frm As System.Windows.Forms.Form
For Each frm In My.Application.OpenForms
frm.Close()
Next frm
End Sub

の部分で
'System.InvalidOperationException' の初回例外が mscorlib.dll で発生しました。
のエラーが発生します。

Formを全て閉じる処理を行いたいのですが

どのような対応をとるとよいのでしょうか?

ご教授宜しくお願いします。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-02-26 19:12
おそらく、発生したのはこのエラーでしょう。
コード:
System.InvalidOperationException: コレクションが変更されました。列挙操作は実行されない可能性があります。
   場所 System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext()



IEnumerator.MoveNext メソッドより:
引用:

コレクションが変更されない限り、列挙子は有効なままです。
要素の追加、変更、削除などの変更がコレクションに対して実行されると、
列挙子は回復不可能な無効状態になり、次に MoveNext または Reset を呼び出すと
InvalidOperationException がスローされます。

くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-02-26 19:37
きっとClose()により、OpenFormsコレクションに変更があった為だと思います。

下記のようにすれば、全フォームを閉じれると思います。
コード:
While (My.Application.OpenForms.Count > 0)
    My.Application.OpenForms(0).Close()
End While

LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2008-02-27 09:19
回答ありがとうございます。

申し訳ありません、
Application.Exit()というのを見つけましたが
これでは、どうなのでしょうか?


くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-02-27 10:03
Application.Exit()でも同じように全フォームを閉じる事が出来ます。

ただ、一つ考慮しなければならないことが
FormがClosingイベントにてキャンセルした場合です。

例えばFormが@〜Bまで開いていた場合に
Application.Exit()を呼び出し、@から順に閉じようとした場合に
AがClosingにてキャンセルを返した場合、@〜Bは閉じません。
(Application.Exit()はキャンセルされた時点で処理が終わります。)

私の提示コードも、キャンセルされた場合、無限ループに陥ります。
(ループ中にキャンセルされなくなれば、以後閉じる処理を続行します)

どちらにしろ、Closingイベントをキャンセルされた場合を考慮する必要が在ると思います。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-02-27 10:12 ]
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2008-02-27 10:44
大変丁寧な回答ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)