2013-10-10 4 views
2

У меня возникли проблемы с копированием ячеек из таблицы данных WPF. У меня есть несколько других окон текстового редактора (например, Avalonedit) в том же приложении, откуда я могу скопировать в буфер обмена, но не из datagrid. Всякий раз, когда я пытаюсь скопировать одну ячейку, я получаю сообщение «Open Clipboard Failed (исключение из HRESULT: 0x800401D0).Ошибка копирования в буфер обмена в WPF Datagrid (CLIPBRD_E_CANT_OPEN)

Поэтому я могу скопировать все остальное, кроме как из datagrid. Я пробовал подход OpenClipboard и CloseClipboard, но не похоже на работу для меня тоже.

Я смотрел на подходе упомянутый здесь. (http://blog.somewhatabstract.com/2012/06/27/when-the-clipboard-says-no/), но я не могу выяснить, как переопределить метод OnExecutingCopy, если я не проистекают из DataGrid и сделать что-то.

ответ

1

@ssarangi

Hi ssarangi ... Я не знаю, если вы когда-либо решали эту проблему с буфером обмена, но я столкнулся с вашим вопросом, пытаясь найти решение проблемы с конфликтом в буфере обмена, с которыми периодически сталкиваются мои пользователи. То, что я делаю это двуединый подход:

  1. перешел к использованию System.Windows.Forms.Clipboard.SetDataObject ("строки", ложный, retryTimes, retryDelay)
  2. Добавлена ​​логика для поиска приложение, с которым у меня возникает спор.

Я ответил другой, аналогичный вопрос, в котором я включал фрагмент кода, так что если вы все еще ищете некоторую помощь, вы можете проверить его и посмотреть, если это помогает: OpenClipboard Failed when copy pasting data from wpf DataGrid

В сущности, я использовал два DllImport «s для GetOpenClipboardWindow() и GetWindowThreadProcessId(), а затем я получаю все активные Process объектов с помощью Process.GetProcesses() и перебирать их в поисках совпадения на либо ручку окна от GetOpenClipboardWindow() или матч на Process.Id (PID), полученный мной через GetWindowThreadProcessId(). Это не решение, но может помочь определить, что блокирует вас из буфера обмена.

Другое дело, что я делаю что снова может помочь переходит к System.Windows.Forms Clipboard класса с встроенным в цикле повторных попыток для SetDataObject().

0

Я знаю, что это старое сообщение, но это решение опубликовано для полноты и отсутствует использование подходящей сигнатуры метода событий DataGrid, связанной с DataGridRowClipboardEventArgs.

Clipboard.SetText может быть взломанным, не хватающим/настраивающим буфер обмена все время.

Set «FullRow» в режиме SelectionUnit для DataGrid называется myDataGrid

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

У нас есть метод myDataGrid_CopyingRowClipboardContent, который вызывается для каждого строки в DataGrid, чтобы скопировать его содержимое в буфер обмена. Например, для 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; 

}

Смежные вопросы