Как получить надстройку Excel VSTO для обновления ячеек, когда окно электронной таблицы свернуто? - PullRequest
0 голосов
/ 24 сентября 2019

В настоящее время я работаю над надстройкой VSTO для Excel.У нас есть код, который может обновлять значение ячейки при получении сообщения из облачного приложения.Я обнаружил, что всякий раз, когда окно электронной таблицы свернуто, ячейка не будет обновляться всякий раз, когда выполняется код для обновления ячейки.

Мы используем свойство Range.Value2 для обновления ячейки.стоимость.Я проверил, что код, который обновляет значение ячейки, фактически выполняется каждый раз, когда окно свернуто.Проблема заключается в том, что значение ячейки не обновляется всякий раз, когда свойство Range.Value2 используется, когда электронная таблица свернута.

Вот код, который обновляет значения ячейки:

private void OnLinkedCellValueChanged(object sender, IEnumerable<CellLinkModel> cells)
{
    foreach (CellLinkModel cell in cells)
    {
        Worksheet worksheet = GetWorksheet(cell.WorkSheetId);

        if (worksheet == null)
        {
            continue;
        }

        Range range = cell.GetRange();
        if (range == null)
        {
            range = (Range) worksheet.Cells[cell.Row, cell.Column];
            cell.SetRange(range);
        }

        range.Value2 = cell.CellValue;
    }
}

ЧтоЯ вижу, что код выполняется, но значение ячейки не обновляется, если Range.Value2 установлен, а окно электронной таблицы свернуто.Кто-нибудь может сказать мне, почему это происходит, и предоставить обходной путь для обновления значения ячейки?

1 Ответ

0 голосов
/ 24 сентября 2019

Мне удалось обойти проблему, используя ссылку , размещенную пользователем @RandRandom в его комментарии к моему вопросу.Может случиться так, что, хотя Excel свернут, рендеринг макета приостановленЛюбое обновление значения Range в течение этого периода приведет к обновлению объекта Range , но не обновит экран.Как только окно электронной таблицы восстановлено и рендеринг снова включен, повторный рендеринг не выполняется.Выполнение операции, которая вызовет повторную визуализацию, такую ​​как прокрутка до тех пор, пока устаревшая ячейка больше не будет видна, затем прокрутка назад приведет к отображению ячейки с правильным значением, поскольку сам объект Range фактическиимеет правильное значение.

Чтобы обойти проблему программно, я подписался на событие AppEvents_Event.WindowResize .В идеале был бы способ аннулировать электронную таблицу, чтобы вызвать повторный рендеринг, который мы могли бы использовать в обработчике событий, но я не знаю ни одного.То, что я делаю в обработчике событий, устанавливает свойство _Application.ScreenUpdating равным самому себе.Установка этого свойства вызывает повторную визуализацию.Код можно найти ниже.

Где уместно в вашем приложении, подпишитесь на событие AppEvents_Event.WindowResize :

Globals.ThisAddIn.Application.WindowResize += OnWindowResize;

В обработчике событий установите _Application.ScreenUpdating Собственное свойство равно:

private void OnWindowResize(Workbook Wb, Microsoft.Office.Interop.Excel.Window window)
{
    Globals.ThisAddIn.Application.ScreenUpdating = Globals.ThisAddIn.Application.ScreenUpdating;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...