【问题标题】:Intermittent exceptions when copying from WPF DataGrid (CLIPBRD_E_CANT_OPEN)从 WPF DataGrid (CLIPBRD_E_CANT_OPEN) 复制时出现间歇性异常
【发布时间】:2014-05-27 23:38:58
【问题描述】:

我的应用程序使用DataGrid 的Copy() 方法检索所有数据以导出为CSV 和其他格式。我所做的只是

  • 清除剪贴板
  • 致电myGrid.Copy()

现在这通常可以正常工作 - 除了我的

即使在这些特定系统上,它也只是偶尔发生,即第一次复制有效,但随后尝试失败(即,相同、有效的表内容复制3 次中有 1 次有效!)带有 CLIPBRD_E_CANT_OPEN 错误和堆栈跟踪,如

   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Windows.Clipboard.Flush()
   at System.Windows.Controls.DataGrid.OnExecutedCopy(ExecutedRoutedEventArgs args)

.net 版本通常是 4.0.30319.x(但据我所知,问题似乎与特定框架版本无关)。

由于导出是应用程序的一个关键功能,这个问题会产生相当大的影响..
任何如何解决此问题的想法将不胜感激!

【问题讨论】:

  • 只是为了消除明显的;你处理过空字段吗? IE。应该保存数据的 null 字段?
  • 是的 - 在一个特定示例中,表中具有相同数据的 1 次是 3 次。所以它一定是我们应用程序之外的东西 - 我想..

标签: c# wpf datagrid wpf-controls clipboard


【解决方案1】:

剪贴板是 Windows 中的共享资源。如果 PC 上的 任何 其他程序当前使用剪贴板,您将得到类似的异常。您所做的任何剪贴板操作都必须非常小心。处理异常。重试几次,也许在等待一段时间后。如果重试几次还是不行,通知用户稍后再试。

有些应用程序在剪贴板方面(或可能是)完全错误。例如,有一个 Skype 版本在 Skype 的整个运行期间完全锁定剪贴板。

您可以调用一些本机 Win32 函数来获取当前阻塞剪贴板的窗口和进程。查看 User32.dll 中的 GetOpenClipboardWindow、GetWindowText 和 GetWindowThreadProcessId。然后使用Process.GetProcessById(processId).ProcessName从给定的Id获取进程名。

您可以在这个类似的问题中找到更多信息:OpenClipboard Failed when copy pasting data from wpf DataGrid

【讨论】:

  • 嗯 - 有趣。有没有办法告诉哪个进程当前拥有剪贴板,以便我们可以告诉用户,即即使重试方案最终失败了?
  • @cacau 我已经编辑了答案以显示如何获取进程名称。
  • 添加了重试方法,它似乎可以在我们的本地测试以及至少一个客户系统上运行 - 干杯!
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
相关资源
最近更新 更多