代码之家  ›  专栏  ›  技术社区  ›  Johann Blais

在dragdrop事件中对getdata的调用将自动失败

  •  0
  • Johann Blais  · 技术社区  · 15 年前

    我正在构建一个WinForms应用程序,它支持拖放到文本框中。文本框应允许将文件和文本放到其中。其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;
    }
    

    第一次测试: 当我在此文本框中删除文件时,将引发dragdrop事件,执行将进入我的处理程序,直到此行(此行上设置了断点):

    var path = (string)e.Data.GetData(DataFormats.FileDrop);
    

    如果我跳过这个指令(F10),执行将继续,但不会命中下一条指令。应用程序再次响应。就好像处理程序被中止了,但没有引发异常。

    第二次测试: 将Visual Studio配置为中断所有异常(选中“调试->异常”窗口中CLR异常前面的“引发”框)。 执行与第一个测试中相同的操作。接下来,在e.data.getdata行上引发一个invalidcastexception(getdata返回一个字符串[],而不是字符串)。

    我在AppDomain或线程上没有任何类型的全局异常处理程序,即使有,我也会在手动跨过失败行时将异常排除在可见范围之外。

    我正在使用Visual Studio 2010。 有什么办法解释这种奇怪的行为吗?这对我很重要,因为如果不是一个孤立的问题,这可能导致难以复制的错误。

    提前多谢

    编辑: 对我来说真正没有意义的是,通常未处理的.NET异常会使应用程序崩溃。这里的invalidCastException来自这样一个事实,即拖放API将数组返回给.NET方法,并且我尝试在运行时将其强制转换为字符串。此时,进程只运行.NET代码。为什么只有在激活未处理异常的自动中断时才会引发异常?

    vdesmedt的回答为这一问题带来了新的启示,但它似乎解释了如果我的应用程序未能处理Drop事件,Explorer为什么不会抱怨。

    2 回复  |  直到 15 年前
        1
  •  4
  •   VdesmedT    15 年前

    在Windows上,拖放操作仍然由这个好的旧OLE处理。OLE总是将操作的源和目标视为两个不同的应用程序,即使它们是相同的应用程序(您的情况)。Ole总是吞下每个异常,而不是将它们转发给这两个应用程序中的任何一个。对于他来说,它不会使sens警告源应用程序目标应用程序在放置期间失败。图;

    在涉及任何OLE操作(即拖放)的处理程序中,绝对必须自己处理异常。

        2
  •  3
  •   Branimir    15 年前

    e.data.getdata(dataformats.filedrop)返回数组,请尝试:

    var path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
    

    你应该得到无效的例外,或者什么…