Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF数据网格中复制到剪贴板失败(剪贴板无法打开)_C#_Wpf_Wpfdatagrid - Fatal编程技术网

C# 在WPF数据网格中复制到剪贴板失败(剪贴板无法打开)

C# 在WPF数据网格中复制到剪贴板失败(剪贴板无法打开),c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,从WPF数据网格复制单元格时遇到问题。我在同一个应用程序中还有一些其他的文本编辑器窗口(比如Avalonedit),我可以从中复制到剪贴板,但不能从datagrid复制。每当我尝试复制一个单元格时,都会收到消息“Open Clipboard Failed(来自HRESULT的异常:0x800401D0)” 我尝试了OpenClipboard和CloseClipboard的方法,但似乎对我也不起作用 我已经研究了这里提到的方法。()但我无法找到如何重写方法OneExecutingCopy,除非我从

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

我尝试了OpenClipboard和CloseClipboard的方法,但似乎对我也不起作用

我已经研究了这里提到的方法。()但我无法找到如何重写方法OneExecutingCopy,除非我从数据网格派生并做些什么。

@ssarangi

您好,ssarangi…我不知道您是否解决过此剪贴板问题,但我在尝试为我的一些用户间歇性遇到的剪贴板争用问题找到解决方案时遇到了您的问题。我正在采取双管齐下的方法:

  • 切换到使用System.Windows.Forms.Clipboard.SetDataObject(“string”、false、retryTimes、retryDelay)
  • 添加了逻辑以查找与我存在争用的应用程序
  • 我回答了另一个类似的问题,其中包含了代码片段,因此如果您仍在寻求帮助,您可以查看它,看看它是否有帮助:

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


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

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

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

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

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

    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;