【发布时间】:2010-09-09 07:16:44
【问题描述】:
我正在构建一个支持拖放到文本框中的 Winforms 应用程序。 TextBox 应该允许将文件和文本拖放到它上面。它的 AllowDrop 属性设置为 true。
这是其 DragDrop 事件的事件处理程序:
var validFile = e.Data.GetDataPresent(DataFormats.FileDrop);
var validText = e.Data.GetDataPresent(DataFormats.Text) ||
e.Data.GetDataPresent(DataFormats.UnicodeText);
if (validFile)
{
var path = (string)e.Data.GetData(DataFormats.FileDrop);
this.textBox.Text = File.ReadAllText(path);
}
else if (validText)
{
var text = (string)e.Data.GetData(typeof(string));
this.textBox.Text = text;
}
第一次测试: 当我在此 TextBox 上放置文件时,会引发 DragDrop 事件,执行将进入我的处理程序,直到此行(在此行上设置断点):
var path = (string)e.Data.GetData(DataFormats.FileDrop);
如果我越过这条指令 (F10),执行会继续,但不会碰到下一条指令。应用程序再次响应。就好像处理程序被中止但没有引发异常。
第二次测试: 将 Visual Studio 配置为中断所有异常(选中 Debug->Exceptions 窗口中 CLR 异常前面的 Throw 框)。 执行与第一个测试相同的操作。然后,在 e.Data.GetData 行上引发了 InvalidCastException(GetData 返回 String[],而不是 String)。
我在 AppDomain 或线程上没有任何类型的全局异常处理程序,即使有,我也会在手动跨过失败行时看到异常。
我正在使用 Visual Studio 2010。 有什么想法可以解释这种奇怪的行为吗?这对我来说很重要,因为如果它不是一个孤立的问题,这可能会导致难以重现的错误。
在此先感谢
编辑: 对我来说真正没有意义的是,通常未处理的 .NET 异常会使应用程序崩溃。这里的 InvalidCastException 来自 Drag&Drop API 将数组返回给 .NET 方法的事实,我尝试在运行时将其转换为字符串。此时,该进程正在运行纯 .NET 代码。为什么只有在激活未处理异常的自动中断时才会引发异常?
VdesmedT 的回答为这个问题带来了新的认识,但它似乎解释了为什么如果我的应用程序无法处理 Drop 事件,Explorer 不会抱怨。
【问题讨论】:
标签: c# .net events exception drag-and-drop