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

时间:2008-09-16 01:38:28

标签: c# winforms drag-and-drop

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

10 个答案:

答案 0 :(得分:479)

一些示例代码:

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

答案 1 :(得分:132)

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

答案 2 :(得分:40)

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

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

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

答案 3 :(得分:16)

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

答案 4 :(得分:12)

还有另一个问题:

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

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

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

答案 5 :(得分:7)

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

答案 6 :(得分:7)

以下是我用来删除文件和/或文件夹的文件。就我而言,我只过滤了*.dwg个文件,并选择包含所有子文件夹。

fileListIEnumerable或类似的在我的情况下被绑定到WPF控件......

var fileList = (IList)FileList.ItemsSource;

有关该技巧的详细信息,请参阅https://stackoverflow.com/a/19954958/492

drop Handler ...

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

答案 7 :(得分:0)

Judah Himango和Hans Passant的解决方案可在Designer中使用(我目前正在使用VS2015): enter image description here enter image description here

答案 8 :(得分:0)

您可以在WinForms和WPF中实现拖放。

  • WinForm(从应用程序窗口拖动)

您应该添加mousemove事件:

private void YourElementControl_MouseMove(object sender, MouseEventArgs e)

    {
     ...
         if (e.Button == MouseButtons.Left)
         {
                 DoDragDrop(new DataObject(DataFormats.FileDrop, new string[] { PathToFirstFile,PathToTheNextOne }), DragDropEffects.Move);
         }
     ...
    }
  • WinForm(拖动到应用程序窗口)

您应该添加DragDrop事件:

private void YourElementControl_DragDrop(object sender,DragEventArgs e)

    {
       ...
       foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop))
            {
                File.Copy(path, DirPath + Path.GetFileName(path));
            }
       ...
    }

https://elm-lang.org/news/0.12.1

答案 9 :(得分:0)

请注意,要执行此操作,还需要在_drawEnter ...中设置dragDropEffect ...

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    Console.WriteLine("DragEnter!");
    e.Effect = DragDropEffects.Copy;
}

来源:Drag and Drop not working in C# Winforms Application