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

ListViewのDragOverイベント中にGetItemAtでListViewItemは取得できない?

分類:[.NET]

ListView上にドラッグされた時マウスがある場所のListViewItemを取得して
バックグラウンドカラーを変更したいと思い、GetItemAtを使ってListViewItem
の取得をこころ見ましたがうまく取得できませんでした。
DragOverイベント中はGetItemAtではListViewItemを取得出来ないのでしょうか?
又MouseHoveイベントも同様でした。

何がしたいのかといいますと、エキスプローラでファイルを他のフォルダに移すとき
フォルダが反転表示になりますが、ああいった感じにしたいと思っています。
ですから、DragOverでの処理が妥当だと思うのですが他によい方法はあるのでしょうか。

Private Sub ListView1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView1.DragOver

        If e.KeyState = 5 Then
             e.Effect = DragDropEffects.Copy
          Else
             e.Effect = DragDropEffects.Move
        End If

        Dim listv As ListView = sender
        '問題のコードです
     Dim listvi As ListViewItem = listv.GetItemAt(e.X, e.Y)
        'ここでどうしてもNothingになってしまう
        If listvi Is Nothing Then Exit Sub

        Dim i As Integer
        Dim flg As Boolean
        For i = 0 To listv.Items.Count - 1
           If listv.Items(i).BackColor.ToArgb = Color.BlueViolet.ToArgb Then
              If listv.Items(i).Text <> listvi.Text Then
                  listv.Items(i).BackColor = Color.Black
                  listvi.BackColor = Color.BlueViolet
                  flg = True
                  Exit For
              End If
           End If
        Next

End Sub

e.Xとe.Yがどこを指しているか、GetItemAtメソッドには何を渡せばいいか考えるべし。

ところでHoverSelectionプロパティをTrueにして選択されているアイテムを得るんじゃダメなの?
0159さんありごとうございます

今回は下記のコードを書いたことにより実現しました
Dim x As Integer = listv.PointToClient(New Point(e.X, e.Y)).X
Dim y As Integer = listv.PointToClient(New Point(e.X, e.Y)).Y

> e.Xとe.Yがどこを指しているか、GetItemAtメソッドには何を渡せばいいか考えるべし。
画面座標とクライアント座標の違いだと思いますが、DragOverの場合もしかして
画面座標だからかな?

>
> ところでHoverSelectionプロパティをTrueにして選択されているアイテムを得るんじゃダメなの?
HoverSelectionはドラッグ操作中は選択されませんし
エキスプローラみたいにドラッグした時でも、選択されているフォルダは変わりませんよね、ああいった動きをさせたいので、かってに選択されてしまうと狙った動きと違ってしまいます。
解決済み!

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