我有一个可以拖动我的表单的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挂起,所以我无法复制和粘贴它。
答案 0 :(得分:5)
我不清楚如何触发此异常,桌面应该没有用于您的控件。鼠标光标应显示“不能放在这里”的形状。然而,D + D期间的第一次机会异常是没有意义的,它们被吞下并且不会影响操作。你只看到它们,因为你已经附加了一个调试器。
如果你真的想要向下钻取它,那么使用Debug + Exceptions,勾选Common Language Runtime异常的Thrown框。引发异常时调试器将停止。它很可能是在Winforms管道代码中引发的,除非启用参考源,否则您将无法查看源代码。如果您无法弄明白,请在您的问题中发布堆栈跟踪。请务必复制整个,然后根据需要滚动以获得顶部激活框。
但重申,这在实践中不应成为问题。用户应该看到“不能掉落”鼠标光标,吞下异常而不终止你的程序。