WPF Datagrid中复制到剪贴板失败(CLIPBRD_E_CANT_OPEN)

时间:2013-10-10 03:16:36

标签: c# wpf wpfdatagrid

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

所以我可以复制粘贴除datagrid之外的所有其他内容。我尝试过OpenClipboard和CloseClipboard方法,但这对我来说似乎也没有用。

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

2 个答案:

答案 0 :(得分:1)

@ssarangi

嗨ssarangi ...我不知道你是否曾解决过这个剪贴板问题,但我在试图寻找解决剪贴板争用问题的解决方案时遇到了一些问题,我的一些用户间歇性地进行了解决。我正在做的是双管齐下的方法:

  1. 切换到使用 System.Windows.Forms.Clipboard.SetDataObject(“string”,false,retryTimes,retryDelay)
  2. 添加逻辑以查找我正在争用的应用。
  3. 我回答了另一个类似的问题,其中包含了代码段,所以如果您仍在寻找帮助,可以查看它是否有帮助:OpenClipboard Failed when copy pasting data from wpf DataGrid

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

    我正在做的另一件事可能会帮助切换到 System.Windows.Forms 剪贴板类,内置的重试循环为 SetDataObject()的。

答案 1 :(得分:0)

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

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

在SelectionUnit模式下为名为myDataGrid的dataGrid设置“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;

}