复制到剪贴板在 WPF 数据网格 (CLIPBRD_E_CANT_OPEN) 中失败

本文关键字:CANT OPEN 失败 CLIPBRD 剪贴板 WPF 数据 网格 数据网 复制 | 更新日期: 2023-09-27 18:34:52

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

所以我可以复制粘贴除数据网格以外的其他所有内容。我尝试了OpenClipboard和CloseClipboard方法,但这似乎也不适合我。

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

复制到剪贴板在 WPF 数据网格 (CLIPBRD_E_CANT_OPEN) 中失败

@ssarangi

嗨萨兰吉...我不知道您是否曾经解决过这个剪贴板问题,但是我在尝试为我的一些用户间歇性遇到的剪贴板争用问题找到解决方案时遇到了您的问题。我正在做的是一个双管齐下的方法:

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

我回答了另一个类似的问题,其中我包含了代码片段,所以如果你仍在寻求一些帮助,你可以检查一下,看看它是否有帮助: 打开剪贴板 从 wpf 数据网格复制粘贴数据时失败

本质上,我为GetOpenClipboardWindow((和GetWindowThreadProcessId((

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

我正在做的另一件可能再次有帮助的事情是切换到System.Windows.Forms Clipboard类,该类具有SetDataObject((的内置重试循环。

我知道这是一个

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

剪贴板.SetText 可以是片状的,而不是一直抓取/设置剪贴板。

在 SelectionUnit 模式下设置"FullRow",用于名为 myDataGrid 的数据网格

<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;

}