首页 文章

如何在同一个ListView中拖放?

提问于
浏览
0

我有一个小文件浏览器应用程序[WINFORMS],我使用ListView控件来探索项目 .
因此listView显示当前地址[来自本地计算机]的文件和文件夹 .
我需要启用拖放功能,让文件/文件夹易于移动/复制到同一地址中的另一个文件夹 . 每个项目都有一些特性:

  • (item.Text/item.Name) 有文件/文件夹 Name .

  • item.ToolTipText 有文件/文件夹 Path .

  • item.SubItems[ 1 ].Text 对于一个文件,它将重新呈现文件大小,如 "13.45 MB" ,对于一个文件夹,它将是 string.Empty [但是,有几种方法可以知道它是文件还是文件夹] .

我已经看过很多关于如何在listview中使用拖放的教程,但它就像从Windows文件资源管理器到ListView,或者从ListView到另一个,但在我的情况下我需要知道如何 drag&drop in the same ListView .

我已启用ListView的AllowDrop属性 . 并激活以下功能:

private void listView1_DragDrop(object sender, DragEventArgs e)
    {
    }

    private void listView1_DragEnter(object sender, DragEventArgs e)
    {
    }

    private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
    }

enter image description here

更新:

我试着用这个:

private void listView1_DragDrop(object sender, DragEventArgs e)
    {
        ListViewItem item = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); //this should be the target item (FOLDER)
        StringBuilder s = new StringBuilder();
        foreach (ListViewItem i in listView1.SelectedItems)
        {
            s.AppendLine(i.Text);
        }
        MessageBox.Show("DRAGGED ITEM : " + s.ToString() + "TARGET ITEM : " + item.Text);
    }
    private void listView1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }
    private void listView1_MouseDown(object sender, MouseEventArgs e)
    {
        var item = listView1.GetItemAt(e.X, e.Y);
        if (item != null)
        {
            listView1.DoDragDrop(item, DragDropEffects.Copy);
        }
    }

listView1_MouseDown 我得到了鼠标指向的项目,但它在我删除拖动项目之前给了我项目,所以如果我将名为"SWImg"的文件夹拖到文件夹"ODDFiles",则messageBox显示 "SWImg - SWImg"

然后我用 listView1_ItemDrag 替换 listView1_MouseDown

private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
        if (e.Item != null)
        {
            listView1.DoDragDrop(e.Item, DragDropEffects.Copy);
        }
    }

同样的结果:S .

1 回答

  • 0

    我已经明白了 .

    private void listView1_DragDrop(object sender, DragEventArgs e)
        {
            if (listView1.SelectedItems.Count == 0) { return; }
            Point p = listView1.PointToClient(MousePosition);
            ListViewItem item = listView1.GetItemAt(p.X, p.Y);
            if (item == null) { return; }
            List<ListViewItem> collection = new List<ListViewItem>();
            foreach (ListViewItem i in listView1.SelectedItems)
            {
                collection.Add((ListViewItem)i.Clone());
            }
            if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move)
            {
                Thread thMove = new Thread(unused => PasteFromMove(item.ToolTipText, collection));
                thMove.Start();
            }
            else
            {
                Thread thCopy = new Thread(unused => PasteFromCopy(item.ToolTipText, collection));
                thCopy.Start();
            }
    
        }
    
        private void listView1_DragOver(object sender, DragEventArgs e)
        {
            if ((e.KeyState & 8) == 8)
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.Move;
        }
    
        private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            listView1.DoDragDrop(e.Item,DragDropEffects.All);
        }
    

相关问题