如何将文件拖放到应用程序中?
时间: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();。在捕获部分。
在发布之前,经过测试,如果一切似乎正常,我将其删除或者替换为真正的异常处理。