いつもお世話になっております。
Exit Forと記述しているのですが、
イベントを発生させてもループから強制的に抜けられません。
ループ処理が重いためか、ループ中のイベント自体無視されているようです。
ちゃんとループから抜け出すにはどうしたらいいでしょうか。
また、AppliCation.DoEvents()で例外が発生してしまいます。
具体的には、DataGridViewをListBoxのように使っておりまして、
選択行が変わる度にPictureBoxにサムネイル画像を一覧表示しています。
例えば、エクスプローラーではフォルダツリーでフォルダを選択すると、
現在表示中の画像のサムネイル表示処理が中断され、
すぐに新しく選択されたフォルダの表示に処理が写りますよね。
あのような動作が理想です。
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
DataGridViewの選択セルが変わると、サムネイル表示メソッドを実行
↓呼び出すメソッド
Private sub ShowThumb()
For ・・・(100枚ぐらい)
処理A) PictureBoxにGraphics.DrawImageでサムネイルを描画
処理B) サムネイル1枚1枚の下に、Label作成
'DataGridViewの選択セルが変更されるとキャンセルフラグが立つ
If flag_cancel = True Then
Exit For
'(新しく選択されたセルの値でメソッドが実行されなおす)
End If
Application.DoEvents() ’←ここで例外が発生します。
Next
End Sub
'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。
SetCurrentCellAddressCore 関数への再入呼び出しを生じるため、この操作は有効ではありません。
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
実際にはもっと複雑ですが、簡単に書くとこのような感じです。
別スレッドでループをさせるなどをすれば解決できるでしょうか。
まだVBを始めて間もないので、別スレッドというのは難しくて自信がないのですが・・。
追記です。
説明がちょっと曖昧でした。
ループ中にフラグが立つと処理を抜けるようにしたいのですが、
そのフラグが立ったのをちゃんと処理するために
Application.DoEvents()と記述しました。
しかしそこで上に書いたような例外が発生してしまうので、ちゃんとループから抜けるためのIF〜文が起こりません。
例外が起こるので強制的にループは終わりますが・・・。
「SetCurrentCellAddressCore 関数への再入呼び出しを生じるため、この操作は有効ではありません。」
というエラーについてググってみたのですが、どうやらDataGridViewのカレントセル移動時に起こりやすいエラーのようでした。よくわかりませんが、CellEnter系のイベントでよく起こるとか・・・。
Application.DoEvent()で割り込む処理は、
セルを選択する動作自体と、
そのイベントで再度呼び出す上記のメソッドですが、
どうやらセルを選択した(選択セルを変えた)だけでエラーになっているようです。
ただセルを選択しているだけなのでなんとか回避したいのですが、方法ご存知のかたいらっしゃいませんでしょうか(;;)
'System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。
SetCurrentCellAddressCore 関数への再入呼び出しを生じるため、この操作は有効ではありません。
DataGridViewのカレントセル移動時に上記の例外が発生する件について、
検索していくつか記事を見つけたのですがいずれも解決はしていないようです。
諦めてListBoxを使うことにしました。