当电子表格窗口最小化时,如何获取Excel VSTO加载项以更新单元格?

时间:2019-09-24 14:45:45

标签: c# excel vsto excel-addins

我目前正在使用Excel的VSTO加载项。我们具有可以在收到来自云应用程序的消息时更新单元格值的代码。我发现,只要电子表格窗口最小化,执行更新单元格的代码就不会更新单元格。

我们使用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 :(得分:0)

我可以通过使用@RandRandom用户在对我的问题的评论中发布的link来解决此问题。可能发生的情况是,在最小化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;
}