如何拖动;删除同一ListView中的项目?

时间:2012-02-25 11:47:03

标签: c# listview drag-and-drop copy listviewitem

enter image description here

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

void copy(ListViewItem [] droppedItems, string destination path)
{
 // Copy target to destination
}

1 个答案:

答案 0 :(得分:4)

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

    bool privateDrag;

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

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

    private void listView1_DragEnter(object sender, DragEventArgs e) {
        if (privateDrag) e.Effect = e.AllowedEffect;
    }

接下来,您需要选择用户可以放置哪个项目。这需要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);
        }
    }

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

相关问题