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

标签 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 类型的对象。它不是可序列化的,我也不希望它是。有没有办法解决这个问题,或者是否有处理将对象拖到主机窗体之外的方法?

调用堆栈:

>   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

最佳答案

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

如果您真的想深入了解它,请使用调试 + 异常,勾选公共(public)语言运行时异常的抛出框。调试器将在引发异常时停止。它很可能是在 Winforms 管道代码中引发的,除非启用引用源,否则您将无法查看源代码。如果您无法弄清楚,请在您的问题中发布堆栈跟踪。请务必复制整个,必要时滚动它以获得顶部激活框架。

但重申一下,这在实践中应该不是问题。用户应该看到“无法放下”鼠标光标,异常会在不终止程序的情况下被吞下。

关于不可序列化对象上的 C# DoDragDrop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5275729/

相关文章:

c# - Enumerable.ToDictionary<TSource, TKey> 是否执行深层复制?

c# - "Or"Together Expression<Func<EntityFramework Entity, bool>> in .NET 4, Silverlight RIA 域服务

c# - Windows 窗体 - 如何保存和加载游戏?

c# - 无法从 'List<string>' 转换为 'string' 异常

Java 通用异常

c++ - 在 catch block 中重新抛出异常

c# - 屏蔽字符串的名字

java - 使用 toString() 方法是一个抽象的例子

c# - 检查文本文件是否在记事本中打开

c# - C# 中的组合框和自动完成