2

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

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

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

4

2 回答 2

1

@ssarangi

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

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

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

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

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

于 2014-01-23T15:02:27.863 回答
0

我知道这是一篇较旧的帖子,但此解决方案是为了完整性而发布的,并且缺少使用与 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;

}

于 2017-09-12T15:48:22.997 回答