我正在构建一个带有拖放支持的Winforms应用程序到TextBox中。 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不会抱怨。
答案 0 :(得分:4)
在Windows上,拖放操作仍由这个好旧的OLE处理。 OLE始终将操作的源和目标视为两个不同的应用程序,即使这两个应用程序是相同的应用程序(您的情况)。 OLE总是吞下每个异常,并且不会将它们转发给两个应用程序中的任何一个。对于他来说,提醒源应用程序目标应用程序在丢弃期间失败是没有意义的。去图; - )
你绝对必须自己处理任何OLE操作中涉及的处理程序中的异常(即拖放)
答案 1 :(得分:3)
e.Data.GetData(DataFormats.FileDrop)返回一个数组,试试:
var path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
您应该获得InvalidCastException或其他内容......