非可序列化对象上的C#DoDragDrop

时间:2011-03-11 16:43:19

标签: c# winforms exception drag-and-drop

我有一个可以拖动我的表单的UserControl。当控件被意外拖离我的表单并进入桌面时(例如),我得到了第一次机会异常:

A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in System.Windows.Forms.dll

Additional information: Invalid FORMATETC structure (Exception from HRESULT: 0x80040064 (DV_E_FORMATETC))

当我开始拖放过程时,我传入一个Control类型的对象。它不是Serializable,也不是我想要的。有没有办法可以解决这个问题,还是有办法在主机窗体外拖动一个对象?

调用堆栈:

>   System.Windows.Forms.dll!System.Windows.Forms.DataObject.GetDataIntoOleStructs(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x175 bytes 
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetDataHere(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, ref System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x70 bytes    
    System.Windows.Forms.dll!System.Windows.Forms.DataObject.System.Runtime.InteropServices.ComTypes.IDataObject.GetData(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, out System.Runtime.InteropServices.ComTypes.STGMEDIUM medium) + 0x152 bytes   
    [Native to Managed Transition]  

这是另一个堆栈,但VS2010挂起,所以我无法复制和粘贴它。 Screenshot

1 个答案:

答案 0 :(得分:5)

我不清楚如何触发此异常,桌面应该没有用于您的控件。鼠标光标应显示“不能放在这里”的形状。然而,D + D期间的第一次机会异常是没有意义的,它们被吞下并且不会影响操作。你只看到它们,因为你已经附加了一个调试器。

如果你真的想要向下钻取它,那么使用Debug + Exceptions,勾选Common Language Runtime异常的Thrown框。引发异常时调试器将停止。它很可能是在Winforms管道代码中引发的,除非启用参考源,否则您将无法查看源代码。如果您无法弄明白,请在您的问题中发布堆栈跟踪。请务必复制整个,然后根据需要滚动以获得顶部激活框。

但重申,这在实践中不应成为问题。用户应该看到“不能掉落”鼠标光标,吞下异常而不终止你的程序。