Ошибка Spreadsheetgear при использовании буфера обмена - PullRequest
2 голосов
/ 17 ноября 2011

В моем приложении я использую электронную таблицу для работы с файлами Excel.Я использую следующий код:

//move incorrect to aux                         
incorrectLine.Select(); //select the line to be moved
wbkView.Cut();

auxLine.Select();
wbkView.Paste();

//move correct to incorrect
correctLine.Select(); //select the line to be moved
wbkView.Cut();

incorrectLine.Select();
wbkView.Paste();

//move aux to correct 
auxLine.Select(); //select the line to be moved
wbkView.Cut();

correctLine.Select();
wbkView.Paste();

Время от времени я получаю следующую ошибку:

Requested Clipboard operation did not succeed. 

с StrackTrace:

at System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)

и ErrorCode = -2147221040

Из того, что я понимаю, есть проблема, если буфер обмена используется другим процессом, поэтому я хочу знать, существует ли другой режим для переключения двух строк из файла Excel без использования буфера обмена.

1 Ответ

2 голосов
/ 18 ноября 2011

Возможно, вы сможете использовать метод IRange.Copy (...) вместо WorkbookView.Cut / Paste.Этот метод выполняет процедуру копирования внутри SpreadsheetGear без использования буфера обмена Windows, поэтому он позволит избежать любых проблем, подобных той, что вы видите здесь.Кроме того, вам не понадобятся все эти вызовы метода Select для навигации по рабочему листу.

Очевидная проблема заключается в том, что это подпрограмма copy , а не cut подпрограмма, которая по-разному ведет себя по-разному:

  • Копирование, очевидно, не затрагивает исходный диапазон;cut удаляет значение и форматирование из исходного диапазона.Вы можете обойти это, очистив исходный диапазон с помощью IRange.Clear () после вызова IRange.Copy ().
  • Более тонко, если ваш исходный диапазон содержит формулы или именованные диапазоны, ссылки в этих формулах, а также именованные диапазоны потенциально могут быть исправлены по-разному при использовании копирования вместо вырезания.С этим ничего не поделаешь, так как это просто способ работы Excel, и SpreadsheetGear следует примеру Excel по этим вопросам.Конечно, если ваш исходный диапазон - просто простые значения без именованных диапазонов, это не проблема.

Собрав все это вместе, ваш код может выглядеть следующим образом:

// move incorrect to aux
incorrectLine.Copy(auxLine);
incorrectLine.Clear();

// move correct to incorrect
correctLine.Copy(incorrectLine);
correctLine.Clear();

// move aux to correct
auxLine.Copy(correctLine);
auxLine.Clear();
...