仮想リストビューの質問です

タグの編集
投稿者 UUQ  (社会人) 投稿日時 2013/5/4 22:50:05
ListViewに画像を表示させるプログラムを作成中なのですがどうしても解決方法が分からないエラーが出てしまうので質問させてください

仮想リストビューのLargeIcon,SmallIcon時にShiftキーを押しながら(マウスによる選択ではエラーは出ません)アイテムを複数選択した時に
起点のアイテムを通過するとエラーが出てしまいます。
(「Argumentexception startIndex 値に endIndex 値より大きい値を指定することはできません。」となってしまいます。(LargeIcon,SmallIcon以外の場合はエラーが出ません))

XP Visualスタイルを解除するとエラーは出なくなるのですが解除はしたくありません。
なのでVisualスタイルのままでこの問題を解決する方法が知りたいです。よろしくお願いします。

環境はVS2008でフレームワークは.netframework3.5を使用しております

下記はエラーを再現させるコードです。

Imports System.Windows.Forms

Public Class TEST
    Inherits System.Windows.Forms.Form
    Private components As System.ComponentModel.IContainer
    Public Sub New()
        Me.components = New System.ComponentModel.Container
        Me.ListView1 = New System.Windows.Forms.ListView
        Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components)
        Me.SuspendLayout()
        '
        'ListView1
        '
        Me.ListView1.Location = New System.Drawing.Point(15, 10)
        Me.ListView1.Name = "ListView1"
        Me.ListView1.Size = New System.Drawing.Size(600, 400)
        Me.ListView1.SmallImageList = Me.ImageList1
        Me.ListView1.TabIndex = 0
        Me.ListView1.UseCompatibleStateImageBehavior = False
        Me.ListView1.VirtualMode = True
        Me.ListView1.VirtualListSize = 20

        '
        'ImageList1
        '
        Me.ImageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit
        Me.ImageList1.ImageSize = New System.Drawing.Size(16, 16)
        Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(630, 420)
        Me.Controls.Add(Me.ListView1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

    Private Sub ListView1_RetrieveVirtualItem(ByVal sender As Object, ByVal e As System.Windows.Forms.RetrieveVirtualItemEventArgs) Handles ListView1.RetrieveVirtualItem
        e.Item = New ListViewItem(e.ItemIndex.ToString)
    End Sub

    Friend WithEvents ListView1 As System.Windows.Forms.ListView
    Friend WithEvents ImageList1 As System.Windows.Forms.ImageList
End Class

Module Program
    <STAThread()> _
    Sub Main()
        Dim _TEST_ As New TEST
        'XP Visualスタイルを有効にした状態でShiftを押しながらListViewItemを選択した場合に起点のアイテムを通過するときに
        'startIndex 値に endIndex 値より大きい値を指定することはできません。となってしまう
        'LargeIcon,SmallIconの時のみ↑のエラーが出てしまう。
        ' __
        ' |11| 12 13 14 15 (11にフォーカスがある状態)
        '   ̄
        '       →
        ' ________
        ' |11 12 13 14 15| (Shiftを押しながら15まで選択)
        '   ̄ ̄ ̄ ̄ ̄ ̄
        '
        ' ____ ←
        ' |11 12| 13 14 15 (上の状態からShiftを押したまま11まで戻るとエラーが発生する)
        '   ̄ ̄
        '
        '
        Application.EnableVisualStyles() '##この行をコメントアウトするとエラーにならない
        Application.Run(_TEST_)
    End Sub
End Module
投稿者 るきお  (社会人) 投稿日時 2013/5/5 15:11:36
やってみましたが私のところではエラーにならず快適に実行できます。

11をクリックして、
Shift + → で 15 まで選択して、
Shift + ← で 11 まで戻す

ですよね?

EnableVisualStyleのこともよくわからないので勘も働かず
とりあえず書いてあるままで試しました。
環境はWindows 7 + VS2010 + .NET Framework 3.5 です。

デスクトップのデザインはクラシックとエアロ(?)の両方で試しましたが変わりませんでした。
投稿者 UUQ  (社会人) 投稿日時 2013/5/5 20:25:32
>るきおさん
検証していただきありがとうございます。
自分でもVS2010expressをダウンロードしていろいろ試してみたのですが
結局同様のエラーが出てしまいました。
その後Googleで検索してみると同様の症状の質問がヒットしました
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/61b2279e-66f3-4a8c-84eb-ed9318796d1f/
Google翻訳で内容を読んでみたところOS等の環境依存で出るバグのようです。
上記リンクにもるきおさんと同じWindows 7で同様の症状が出てる人も居るようなので(自分もWindows 7です)詳しい条件等は分からないのですが
とりあえず上記リンクにあるC#のコードをVBに変換して手直しした所Shift選択でのエラーはなくなりましたので解決と致します。
投稿者 るきお  (社会人) 投稿日時 2013/5/5 20:37:26
とりあえず解決してよかったです。
リンク先の情報だと.NET Frameworkのバグの可能性があるようですね。