我正在尝试将用树节点表示的文件拖到桌面,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);
}