当前位置:  开发笔记 > 编程语言 > 正文

如何将文件拖放到应用程序中?

如何解决《如何将文件拖放到应用程序中?》经验,为你挑选了7个好方法。

我已经在Borland的Turbo C++环境中看到过这种情况,但是我不知道如何处理我正在研究的C#应用​​程序.是否有最佳实践或需要注意的问题?



1> Hans Passant..:

一些示例代码:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      this.AllowDrop = true;
      this.DragEnter += new DragEventHandler(Form1_DragEnter);
      this.DragDrop += new DragEventHandler(Form1_DragDrop);
    }

    void Form1_DragEnter(object sender, DragEventArgs e) {
      if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
    }

    void Form1_DragDrop(object sender, DragEventArgs e) {
      string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
      foreach (string file in files) Console.WriteLine(file);
    }
  }


免责声明:如果您在Windows 7中以管理员身份运行Visual Studio,或者以管理员身份运行程序,则它可能无法在调试中运行.见[here](http://stackoverflow.com/questions/2833709/c-sharp-drag-drop-does-not-work-on-windows-7)
@Burnsys如果你有拖拽操作的文件路径,那么你可以使用`io.File`阅读
对于任何`FileDrop`格式的drop,`(string [])`cast是否安全?也就是说,是否有可能生成一个`FileDrop`,它将导致`string []`的非法转换异常?我无法从[文档](https://msdn.microsoft.com/en-us/library/c6a9edsb(v = vs.110).aspx)中找出答案.

2> Wayne Uroda..:

请注意Windows Vista/Windows 7安全权限 - 如果您以管理员身份运行Visual Studio,则在Visual Studio中运行文件时,无法将文件从非管理员资源管理器窗口拖动到程序中.与拖拽相关的事件甚至不会开火!我希望这可以帮助别人,而不是浪费他们一生的时间......


@Wayne Uroda:我认为我的代码不能正常工作 - 哎呀它给了我一个很大的"无符号",如http://en.wikipedia.org/wiki/File:ProhibitionSign2.svg.然后我看到了这个答案并运行VS作为非管理员和presto它的工作原理!太感谢了.

3> Judah Gabrie..:

在Windows窗体中,设置控件的AllowDrop属性,然后侦听DragEnter事件和DragDrop事件.

DragEnter事件触发时,将参数设置为非AllowedEffect空(例如e.Effect = DragDropEffects.Move).

DragDrop事件触发时,您将获得一个字符串列表.每个字符串都是要删除的文件的完整路径.



4> Phil Wright..:

你需要知道一个问题.在拖放操作中作为DataObject传递的任何类都必须是Serializable.因此,如果您尝试传递一个对象,并且它无法正常工作,请确保它可以序列化,因为这几乎肯定是问题所在.这让我抓了几次!



5> Guge..:

还有另一个问题:

调用Drag-events的框架代码会吞下所有异常.您可能认为您的事件代码运行顺利,而整个地方都出现异常情况.您无法看到它们,因为框架会窃取它们.

这就是为什么我总是在这些事件处理程序中放置一个try/catch,因此我知道它们是否会抛出任何异常.我通常把Debugger.Break(); 在捕获部分.

在发布之前,在测试之后,如果一切似乎都表现出来,我会通过真正的异常处理来删除或替换它们.



6> Craig Eddy..:

另一个常见问题是您可以忽略Form DragOver(或DragEnter)事件.我通常使用Form的DragOver事件来设置AllowedEffect,然后使用特定控件的DragDrop事件来处理已删除的数据.



7> CAD bloke..:

这是我用来删除文件和/或文件夹的文件.在我的情况下,我只过滤*.dwg文件,并选择包括所有子文件夹.

fileList是一个IEnumerable或类似在我的情况下绑定到WPF控件...

var fileList = (IList)FileList.ItemsSource;

有关该技巧的详细信息,请参阅/sf/ask/17360801/.

掉落处理程序......

  private void FileList_OnDrop(object sender, DragEventArgs e)
  {
    var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop));
    var files = dropped.ToList();

    if (!files.Any())
      return;

    foreach (string drop in dropped)
      if (Directory.Exists(drop))
        files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories));

    foreach (string file in files)
    {
      if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg"))
        fileList.Add(file);
    }
  }

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有