■No34971に返信(vettさんの記事)
> ListViewのDetailモードで表形式に表示しています。
WPF にも ASP.NET にも WinForms にも ListView があるんですよね…。
"Detail" というのは、
"Details" のことでしょうか。
とりあえず WinForms 版 ListView の Views プロパティのことだと仮定します。
> 任意のItemを選択してDragDrop動作はできたのですが、
どのようにしてそれを実装したのかを明示して頂かないと、
問題点を指摘しにくいです…(想像で補って回答せねばならない)。
> 表の最下部にだけDropできません。> Drag中に表示される黒い太線(境界線)が最下部に移動しないようです。
WinForms 版 ListView だとした場合、
.InsertionMark.AppearsAfterItem の切り替え部をどのように実装していますか?
サンプルを書いてみました。手抜き実装ですが。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ListView1.BeginUpdate()
ListView1.AllowDrop = True
ListView1.View = View.Details
ListView1.GridLines = True
ListView1.FullRowSelect = True
ListView1.Columns.Clear()
ListView1.Columns.Add("Name")
For Each f In System.IO.Directory.GetDirectories("C:\Program Files")
ListView1.Items.Add(System.IO.Path.GetFileName(f))
Next
ListView1.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent)
ListView1.EndUpdate()
End Sub
Private Sub ListView1_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView1.ItemDrag
ListView1.DoDragDrop(e.Item, DragDropEffects.Move)
End Sub
Private Sub ListView1_DragEnter(sender As Object, e As DragEventArgs) Handles ListView1.DragEnter
e.Effect = e.AllowedEffect
End Sub
Private Sub ListView1_DragLeave(sender As Object, e As EventArgs) Handles ListView1.DragLeave
ListView1.InsertionMark.Index = -1
End Sub
Private Sub ListView1_DragDrop(sender As Object, e As DragEventArgs) Handles ListView1.DragDrop
Dim targetIndex = ListView1.InsertionMark.Index
If targetIndex = -1 Then
Return
ElseIf ListView1.InsertionMark.AppearsAfterItem Then
targetIndex += 1
End If
Dim draggedItem = DirectCast(e.Data.GetData(GetType(ListViewItem)), ListViewItem)
ListView1.Items.Insert(targetIndex, DirectCast(draggedItem.Clone(), ListViewItem))
ListView1.Items.Remove(draggedItem)
End Sub
Private Sub ListView1_DragOver(sender As Object, e As DragEventArgs) Handles ListView1.DragOver
Dim targetPoint = ListView1.PointToClient(New Point(e.X, e.Y))
Dim targetIndex As Integer = ListView1.InsertionMark.NearestIndex(targetPoint)
If targetIndex > -1 Then
Dim itemBounds = ListView1.GetItemRect(targetIndex)
ListView1.InsertionMark.AppearsAfterItem = targetPoint.Y > itemBounds.Top + itemBounds.Height \ 2
End If
ListView1.InsertionMark.Index = targetIndex
End Sub
End Class