在列表视图的上下文菜单中实现复制和粘贴

Posted

技术标签:

【中文标题】在列表视图的上下文菜单中实现复制和粘贴【英文标题】:implementing copy and paste in context menu of a listview 【发布时间】:2013-01-17 13:33:33 【问题描述】:

我有一个ListView,它显示了计算机的文件和文件夹。我添加了一个上下文菜单,当右键单击时,它可以复制/粘贴/删除/重命名等。 选择文件后,其路径将保存在字符串中。

现在我该如何剪切并保存到剪贴板。 然后转到一个目录并将文件粘贴到那里。复制和移动到方法似乎不起作用,因为我必须在单独的点击上实现复制和粘贴

 private void copyToolStripMenuItem_Click(object sender, EventArgs e)
 
     string ItemClicked = listView1.FocusedItem.Tag.ToString();
     if (ItemClicked != string.Empty)
     
         Clipboard.SetFileDropList(ItemClicked);//error
     

【问题讨论】:

您希望文本被剪切?如复制到剪贴板并从listview中删除? 不,我想剪切文件,当我转到另一个目录时,我想粘贴该文件 文件的整个路径在ItemClicked字符串中 【参考方案1】:

您需要传入StringCollection 而不是string。试试这个:

private void copyToolStripMenuItem_Click(object sender, EventArgs e)

    if (listView1.SelectedItems.Count > 0)
    
        System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
        sc.Add(listView1.FocusedItem.Tag.ToString());

        Clipboard.SetFileDropList(sc);
    

请注意,这只会复制到剪贴板。为了按照您的意愿进行剪切,您需要确定这意味着什么:从listview 中删除或从其原始位置删除文件(粘贴后?)


回应cmets:

//public variables
StringCollection copiedFiles = new StringCollection();
bool cutWasSelected;

private void copyToolStripMenuItem_Click(object sender, EventArgs e)

    CopySelectedFiles();
    cutWasSelected = false;


private void cutToolStripMenuItem_Click(object sender, EventArgs e)

    CopySelectedFiles();
    cutWasSelected = true;

private void CopySelectedFiles()

    if (listView1.SelectedItems.Count > 0)
    
        foreach (ListViewItem item in listView1.SelectedItems)
        
            copiedFiles.Add(item.Tag.ToString());
        
    


private void pasteToolStripMenuItem_Click(object sender, EventArgs e)

    string destinationFolder;//however you select this
    PasteCopiedFiles(destinationFolder, cutWasSelected);



private void PasteCopiedFiles(string DestinationFolder, bool deleteSourceFiles)

    if (copiedFiles.Count > 0)
    
        foreach (string file in copiedFiles)
        
            if (deleteSourceFiles)
            
                File.Move(file,Path.Combine(new string[]DestinationFolder,Path.GetFileName(file)));
            
            else
            
                File.Copy(file, Path.Combine(new string[]  DestinationFolder, Path.GetFileName(file) ));
            
        
    

【讨论】:

ctrl+v?我认为目的是让用户控制粘贴功能。如果您只想从代码中移动文件,Clipboard 可能不是要走的路。查看静态File 类的方法。 如果你想这样做,我认为你完全可以不使用剪贴板。由于您不希望用户将文件移动到应用程序之外/使用 Windows 资源管理器将其粘贴,因此不要让他们这样做。查看我的更新

以上是关于在列表视图的上下文菜单中实现复制和粘贴的主要内容,如果未能解决你的问题,请参考以下文章

为列表视图和列表视图项创建单独的上下文菜单

上下文感知复制和粘贴到反应应用程序

带有列表子项可聚焦android的列表视图上下文菜单

VMware Workstation虚拟机Ubuntu中实现与主机共享(复制和粘贴)

检测在列表视图内单击并显示上下文菜单

通过上下文菜单使用更新和删除选项的列表视图