如何在同一个 ListView 中拖放项目?

Mur*_*sli 3 c# listview drag-and-drop copy listviewitem

在此处输入图片说明

考虑到这是一个显示文件和文件夹的 ListView,我已经为复制/移动/重命名/显示属性等编写了代码,我只需要最后一件事。如何像在 Windows 资源管理器中一样在同一个 ListView 中拖放,我有移动和复制功能,我只需要获取用户在某个文件夹中放置的项目或以其他方式我需要获取这两个参数来调用复制功能

void copy(ListViewItem [] droppedItems, string destination path)
{
 // Copy target to destination
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

首先将列表视图的 AllowDrop 属性设置为 true。实现 ItemDrag 事件以检测拖动的开始。我将使用一个私有变量来确保 D+D 只在控件内工作:

    bool privateDrag;

    private void listView1_ItemDrag(object sender, ItemDragEventArgs e) {
        privateDrag = true;
        DoDragDrop(e.Item, DragDropEffects.Copy);
        privateDrag = false;
    }
Run Code Online (Sandbox Code Playgroud)

接下来你需要 DragEnter 事件,它会立即触发:

    private void listView1_DragEnter(object sender, DragEventArgs e) {
        if (privateDrag) e.Effect = e.AllowedEffect;
    }
Run Code Online (Sandbox Code Playgroud)

接下来,您需要选择用户可以放置的项目。这需要 DragOver 事件并检查正在悬停的项目。您需要将代表文件夹的项目与常规“文件”项目区分开来。一种方法是使用 ListViewItem.Tag 属性。例如,您可以将其设置为文件夹的路径。使此代码工作:

    private void listView1_DragOver(object sender, DragEventArgs e) {
        var pos = listView1.PointToClient(new Point(e.X, e.Y));
        var hit = listView1.HitTest(pos);
        if (hit.Item != null && hit.Item.Tag != null) {
            var dragItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
            copy(dragItem, (string)hit.Item.Tag);
        }
    }
Run Code Online (Sandbox Code Playgroud)

如果您想支持拖动多个项目,则将您的拖动对象设为 ListView.SelectedIndices 属性。