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

时间:2020-03-05 18:54:57  来源:igfitidea点击:

我已经在Borland的Turbo C ++环境中看到了这一点,但是我不确定如何针对正在开发的C应用程序进行此操作。是否需要寻找最佳做法或者陷阱?

解决方案

回答

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

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

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

回答

我们需要注意一个陷阱。在拖放操作中作为DataObject传递的任何类都必须是可序列化的。因此,如果我们尝试传递一个对象,但该对象不起作用,请确保可以对其进行序列化,因为这几乎可以肯定是问题所在。这吸引了我几次!

回答

另一个常见的陷阱是我们可以忽略Form DragOver(或者DragEnter)事件。我通常使用Form的DragOver事件来设置AllowedEffect,然后使用特定控件的DragDrop事件来处理放置的数据。

回答

一些示例代码:

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

回答

另一个陷阱:

调用Drag-events的框架代码吞没了所有异常。我们可能会认为事件代码运行顺畅,而到处都是异常。我们看不到它们,因为框架会窃取它们。

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

在发布之前,经过测试,如果一切似乎正常,我将其删除或者替换为真正的异常处理。