将文件从treenode拖到桌面或Windows Explorer



我正在尝试将用树节点表示的文件拖到桌面,Windows Explorer或任何其他允许将文件放在其上的应用程序。我已经根据我发现的各种互联网示例编写了代码,并且正在以管理员的身份运行它。只要我保留在包含节点的TreeView控件中,它确实可以拖动它,并在移动时用光标显示复制图标。但是,当我将其从控件上拖到桌面或Windows Explorer时,图标将变成红色圆圈,上面斜线上斜线,没有掉落。我确保了拖动文件确实存在。

private void treeView_Files_ItemDrag(object sender, ItemDragEventArgs e)
{
    DoDragDrop(e.Item, DragDropEffects.Copy);
}
private void treeView_Files_DragDrop(object sender, DragEventArgs e)
{
    TreeNode NewNode;
    if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
    {
        Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
        TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
        NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
        string[] files = new string[] { "C:\temp\TestFile.pdf" };
        DataObject dataObject = new DataObject(DataFormats.FileDrop, files);
        DoDragDrop(dataObject, DragDropEffects.Copy);
    }
}

我无法弄清楚为什么上面的原始代码不会在光标上显示复制图标,除非它在TreeView Control本身中,因此,不允许我丢弃所需的所需的所需的图标文件。但是,我能够提出一个确实显示图标的解决方案,并将删除任何能够接受掉落文件的应用程序。我只是简单地放弃了ItemDrag和DragDrop事件的使用,而是使用Mousedown事件,如下所示。就像在我的原始代码中一样,我使用的是测试文件,而不是节点表示的文件,但是从节点中提取真实文件路径是微不足道的。当然,需要一些其他简单的代码来确定坐标是否实际上在节点上:

private void treeView_Files_MouseDown(object sender, MouseEventArgs e)
{
    TreeNode node = treeView_Files.GetNodeAt(e.X, e.Y);
    string[] files = new string[] { "C:\temp\TestFile.pdf" };
    DataObject dataObject = new DataObject(DataFormats.FileDrop, files);
    DoDragDrop(dataObject, DragDropEffects.Copy);
}

尝试构建DataObject并执行ItemDrag函数中的DoDragDrop()操作,而不是DragDrop函数:

private void treeView_Files_ItemDrag(object sender, ItemDragEventArgs e)
{
    string[] files = new string[] { "C:\temp\TestFile.pdf"};
    DataObject dataObject = new DataObject(DataFormats.FileDrop, files);
    DoDragDrop(dataObject, DragDropEffects.Copy);
}

e.Item参数(这是TreeView项目(并不是您要将其传递给Explorer的对象,因此您不应该将其放入DoDragDrop调用中。

在旁注上,我花了很长时间研究如何将项目放在其中的"目的地"文件夹中。我的解决方案大致涉及以下内容:

  • 创建FileSystemWatcher并在创建新文件时使其发送事件。
  • 给它一个匹配您要删除的文件名的Filter
  • 删除文件(即,在目标文件夹中创建该文件时(,您将通过观察者收到一个事件。

类似的东西:

private void CreateWatcher()
{
    var watcher = new FileSystemWatcher();
    watcher.Filter = "TestFile.pdf";
    watcher.NotifyFilter = NotifyFilters.FileName;
    watcher.Created += new FileSystemEventHandler(OnWatcherFileCreated);
    watcher.IncludeSubdirectories = true;
    watcher.Path = "C:\";
    watcher.EnableRaisingEvents = true;
}
private void OnWatcherFileCreated(object sender, FileSystemEventArgs e)
{
    // Note: this happens in a separate non-UI thread.
    Console.WriteLine("Dropped onto: " + e.FullPath);
}

最新更新