【问题标题】:Copy to clipboard failed in WPF Datagrid (CLIPBRD_E_CANT_OPEN)在 WPF Datagrid 中复制到剪贴板失败 (CLIPBRD_E_CANT_OPEN)
【发布时间】:2013-10-17 15:56:19
【问题描述】:

我在从 WPF 数据网格复制单元格时遇到问题。我在同一个应用程序中有几个其他文本编辑器窗口(如 Avalonedit),我可以从中复制到剪贴板,但不能从数据网格复制。每当我尝试复制一个单元格时,我都会收到消息“打开剪贴板失败(HRESULT 异常:0x800401D0)。

所以我可以复制粘贴除数据网格之外的所有内容。我尝试了 OpenClipboard 和 CloseClipboard 方法,但这似乎对我也不起作用。

我看过这里提到的方法。 (http://blog.somewhatabstract.com/2012/06/27/when-the-clipboard-says-no/) 但我无法找到如何覆盖 OnExecutingCopy 方法,除非我从 DataGrid 派生并执行某些操作。

【问题讨论】:

    标签: c# wpf wpfdatagrid


    【解决方案1】:

    @ssarangi

    您好 ssarangi...我不知道您是否解决了这个剪贴板问题,但我在尝试找到解决剪贴板争用问题的方法时遇到了您的问题,我的一些用户间歇性地遇到了剪贴板争用问题。我正在做的是一个两管齐下的方法:

    1. 改用System.Windows.Forms.Clipboard.SetDataObject("string", false, retryTimes, retryDelay)
    2. 添加了查找我与之争用的应用程序的逻辑。

    我回答了另一个类似的问题,其中包含了代码 sn-p,因此如果您仍在寻求帮助,可以查看它是否有帮助:OpenClipboard Failed when copy pasting data from wpf DataGrid

    本质上,我为 GetOpenClipboardWindow()GetWindowThreadProcessId() 使用了两个 DllImport,然后我得到了所有活动的 Process 对象通过 Process.GetProcesses() 并遍历它们以查找 GetOpenClipboardWindow() 的窗口句柄上的匹配项或 上的匹配项>Process.Id(PID)我通过GetWindowThreadProcessId()获得。这不是一个解决方案,但它可能有助于识别将您锁定在剪贴板之外的原因。

    我正在做的另一件事可能会有所帮助是切换到 System.Windows.Forms 剪贴板类,该类具有 的内置重试循环设置数据对象()

    【讨论】:

      【解决方案2】:

      我知道这是一篇较旧的帖子,但此解决方案是为了完整性而发布的,并且缺少使用与 DataGridRowClipboardEventArgs 关联的合适的 DataGrid 事件方法签名。

      Clipboard.SetText 可能很不稳定,不会一直抓取/设置剪贴板。

      在名为 myDataGrid 的 dataGrid 的 SelectionUnit 模式下设置“FullRow”

      <DataGrid x:Name="myDataGrid" SelectionUnit="FullRow"></DataGrid>
      

      我们有一个 myDataGrid_CopyingRowClipboardContent 方法,它会为 dataGrid 中的 每一 行调用,以将其内容复制到剪贴板。例如,对于一个有 7 行的数据网格,这被调用了 7 次。

      public int clipboardcalledcnt { get; set; } //CopyingRowClipboardContent invoked count
      private void myDataGrid_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e)
      {
          PathInfo cellpath = new PathInfo(); //a custom class to hold path info
          string path = string.Empty;
      
      DataGrid dgdataPaths = (DataGrid)sender;
      int rowcnt = dgdataPaths.SelectedItems.Count;
      
      cellpath = (PathInfo)e.Item;
      
      path = "Row #"+ clipboardcalledcnt +" Len="+ cellpath.Length.ToString() + ", path=" + cellpath.Path;
      
      e.ClipboardRowContent.Clear();
      
      if (clipboardcalledcnt == 0) //add header to clipboard paste
          e.ClipboardRowContent.Add(new DataGridClipboardCellContent("", null, "--- Clipboard Paste ---\t\t\n")); // \t cell divider, repeat (number of cells - 1)
      
      clipboardcalledcnt++;
      e.ClipboardRowContent.Add(new DataGridClipboardCellContent(path, null, path));
      
      if (clipboardcalledcnt == rowcnt)
          clipboardcalledcnt = 0;
      

      }

      【讨论】:

        猜你喜欢
        • 2012-12-02
        • 1970-01-01
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多