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

ツリー一括表示

Nomalアイコン 表の最後の行の下にDropできない /vett (21/11/25(Thu) 07:24) #34971
Nomalアイコン Re[1]: 表の最後の行の下にDropできない /魔界の仮面弁士 (21/11/25(Thu) 09:59) #34973


親記事 / ▼[ 34973 ]
■34971 / 親階層)  表の最後の行の下にDropできない
□投稿者/ vett 一般人(1回)-(2021/11/25(Thu) 07:24:16)
  • アイコン環境/言語:[Windows10 64Bit VB.NET .NET Framework4.5] 
    分類:[.NET] 

    ListViewのDetailモードで表形式に表示しています。
    任意のItemを選択してDragDrop動作はできたのですが、
    表の最下部にだけDropできません。
    Drag中に表示される黒い太線(境界線)が最下部に移動しないようです。
    その他のところには問題なく太い黒線表示され移動できています。
    なにか設定が不足しているのでしょうか?

違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34971 ] / 返信無し
■34973 / 1階層)  Re[1]: 表の最後の行の下にDropできない
□投稿者/ 魔界の仮面弁士 大御所(1413回)-(2021/11/25(Thu) 09:59:24)
  • アイコン
    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

違反を報告
[ 親 34971 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -