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

How to drag amp; drop items in the same ListView?(如何拖动amp;将项目放在同一个 ListView 中?)
本文介绍了如何拖动&将项目放在同一个 ListView 中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

Consider this is a ListView that shows files and folders, I have already wrote code for copy/move/rename/show properties ...etc and I just need one more last thing. how to drag and drop in the same ListView like in Windows Explorer, I have move and copy functions, and I just need to get the items which user drops in some folder or in other way I need to get these two parameters to call copy function

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

推荐答案

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

Start by setting the list view's AllowDrop property to true. Implementing the ItemDrag event to detect the start of a drag. I'll use a private variable to ensure that D+D only works inside of the control:

    bool privateDrag;

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

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

Next you'll need the DragEnter event, it will fire immediately:

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

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

Next you'll want to be selective about what item the user can drop on. That requires the DragOver event and checking which item is being hovered. You'll need to distinguish items that represent a folder from regular 'file' items. One way you can do so is by using the ListViewItem.Tag property. You could for example set it to the path of the folder. Making this code work:

    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 属性.

If you want to support dragging multiple items then make your drag object the ListView.SelectedIndices property.

这篇关于如何拖动&将项目放在同一个 ListView 中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Force JsonConvert.SerializeXmlNode to serialize node value as an Integer or a Boolean(强制 JsonConvert.SerializeXmlNode 将节点值序列化为整数或布尔值)
Using JSON to Serialize/Deserialize TimeSpan(使用 JSON 序列化/反序列化 TimeSpan)
Could not determine JSON object type for type quot;Classquot;(无法确定类型“Class的 JSON 对象类型.)
How to deserialize a JSONP response (preferably with JsonTextReader and not a string)?(如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?)
how to de-serialize JSON data in which Timestamp it-self contains fields?(如何反序列化时间戳本身包含字段的JSON数据?)
JSON.Net custom contract serialization and Collections(JSON.Net 自定义合约序列化和集合)