我目前正在使用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时,单元格值未更新。谁能告诉我为什么会这样,并提供一种变通方法来更新单元格值?
答案 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;
}