【问题标题】:C# DoDragDrop on Non-Serializable object不可序列化对象上的 C# DoDragDrop
【发布时间】:2011-03-11 16:43:19
【问题描述】:

我有一个可以在表单周围拖动的 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 挂起,所以我无法复制和粘贴它。

【问题讨论】:

  • 我不希望我的对象被拖到桌面或其他应用程序中。 MSDN DoDragDrop 声明:如果拖动操作需要与另一个进程中的应用程序互操作,则数据应该是基托管类(String、Bitmap 或 Metafile),或者是实现 ISerializable 或 IDataObject 的对象。
  • 是否阻止用户在拖动选项时将控件移出窗口边界?
  • 我不想要它的唯一原因是因为我没有用拖到我的窗口之外。问题是程序抛出了异常。

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


【解决方案1】:

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

如果您真的想深入了解,请使用 Debug + Exceptions,勾选 Common Language Runtime 异常的 Thrown 框。引发异常时,调试器将停止。它很可能是在 Winforms 管道代码中引发的,除非您启用参考源,否则您将无法查看源代码。如果您无法弄清楚,请在您的问题中发布堆栈跟踪。一定要复制整个,如有必要,滚动它以获取顶部激活帧。

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

【讨论】:

  • 堆栈跟踪不够深。这可能意味着代码由放置目标激活,而不是您的事件处理程序之一。你对此无能为力。翻转忽略位。
  • 这不是很清楚,但 Hans 说,由于这只是第一次机会异常,只要您的程序按预期工作,您就可以忽略它。您通常只需要担心未处理的异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多