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

本文关键字:复制 实现 菜单 列表 视图 上下文 | 更新日期: 2023-09-27 17:54:22

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

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

上实现复制和粘贴
 private void copyToolStripMenuItem_Click(object sender, EventArgs e)
 {
     string ItemClicked = listView1.FocusedItem.Tag.ToString();
     if (ItemClicked != string.Empty)
     {
         Clipboard.SetFileDropList(ItemClicked);//error
     }
}

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

您需要传递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中删除或从原始位置删除文件(粘贴后?)


对评论的回应:

//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) }));
            }
        }
    }
}