DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ListView選択時にItemsをクリアした場合の例外について

環境/言語:[VB.NET]
分類:[.NET]

いつもお世話になっています。
りきです。

現在、VB.NETでWindowsアプリケーションを開発しています。

さっそくですが、
ListViewのSelectedIndexChange(略)内でItemsをクリアすると例外が発生します。

問題なのは、通常にItems.Clearを呼んでも落ちないのに、
MessageBoxを表示した後にItems.Clearすると例外が発生するということです。

なぜ、メッセージボックスを表示した後だと例外が発生するのでしょうか?
フォーカスがメッセージボックスから戻ってくるときに
Itemsに対して何か処理が行われているのでしょうか?

考えてみたのですがわかりませんでした。
どなたかご存知の方はいらっしゃいませんでしょうか?

簡単ですが、SelectedIndexChangedのメソッドを添付します。
ListViewのViewプロパティは「Details」です。

よろしくお願いします。

-------------------------

Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged

'メッセージボックスを表示すると落ちます
'表示しないと落ちません
MessageBox.Show("test")
Me.ListView1.Items.Clear()

End Sub
■No6585に返信(りきさんの記事)
> ListViewのSelectedIndexChange(略)内でItemsをクリアすると例外が発生します。
> 問題なのは、通常にItems.Clearを呼んでも落ちないのに、
> MessageBoxを表示した後にItems.Clearすると例外が発生するということです。

ちなみに、マウスでアイテムを選択した時だけ例外が発生しますね。
同じ意味ではFocusが当たっていないと、起きない現象のようです。

> なぜ、メッセージボックスを表示した後だと例外が発生するのでしょうか?
> フォーカスがメッセージボックスから戻ってくるときに
> Itemsに対して何か処理が行われているのでしょうか?

行われています。
実際には、SelectedIndexChanged()イベントハンドラではなくMessageLoopを経て、
ListViewItemCollection.get_Item(Int32 displayIndex)で例外が発生してます。
ここで再度取得しに行くようですが、クリアされているので、
該当するインデックスがなくArgumentOutOfRangeExceptionが発生するわけですね。

# そもそも、SelectedIndexChanged() イベントではそのような操作を行わないでくださいね。
■No6590に返信(java.lang.Nullpoさんの記事)
> ■No6585に返信(りきさんの記事)
> 実際には、SelectedIndexChanged()イベントハンドラではなくMessageLoopを経て、
> ListViewItemCollection.get_Item(Int32 displayIndex)で例外が発生してます。
> ここで再度取得しに行くようですが、クリアされているので、
> 該当するインデックスがなくArgumentOutOfRangeExceptionが発生するわけですね。
>
> # そもそも、SelectedIndexChanged() イベントではそのような操作を行わないでくださいね。

返答ありがとうございます。
そうですね。
SelectedIndexChange()の中ですることじゃないですね・・・

質問ついでに
java.lang.Nullpoさんが言われている「MessageLoop」ということの意味がいまいちつかめませんでした。
Webをみましたがピンときませんでした。勉強不足ですいません
簡単にご説明いただけないでしょうか?
■No6592に返信(りきさんの記事)
> 質問ついでに
> java.lang.Nullpoさんが言われている「MessageLoop」ということの意味が
> いまいちつかめませんでした。
> Webをみましたがピンときませんでした。勉強不足ですいません

SDKの経験がない場合、MessageLoopを単に調べてもピンと来ないかもしれません。

> 簡単にご説明いただけないでしょうか?

私がWindowsを作ったわけではないので、うまく説明できませんが...
お言葉に甘えて「簡単」に。

Windowsの仕組み自体を勉強するか、WindowsSDKあたりを勉強すればわかります。
WindowsはマルチタスクのOSなのはお判りですよね?
ユーザが「何かした」ことを通知するのは「誰」なのか、
イベントが起こすことができるのは何故か、どこで監視しているのか...

ちょっと御幣がありますが、初めは「その程度のもの」と考えれば良いでしょう。

まずは、WndProc()で雰囲気を掴むと良いかもしれません。
■No6594に返信(java.lang.Nullpoさんの記事)
> 私がWindowsを作ったわけではないので、うまく説明できませんが...
> お言葉に甘えて「簡単」に。
>
> Windowsの仕組み自体を勉強するか、WindowsSDKあたりを勉強すればわかります。
> WindowsはマルチタスクのOSなのはお判りですよね?
> ユーザが「何かした」ことを通知するのは「誰」なのか、
> イベントが起こすことができるのは何故か、どこで監視しているのか...
>
> ちょっと御幣がありますが、初めは「その程度のもの」と考えれば良いでしょう。
>
> まずは、WndProc()で雰囲気を掴むと良いかもしれません。

ありがとうございます。
WndProcの実装は行ったことがありますので、理解しているつもりですが
「MessageLoop」という単語が意味しているものがわかりませんでした。

勉強してみます。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板