C# 当电子表格窗口最小化时,如何让Excel VSTO加载项更新单元格?
我目前正在为Excel开发VSTO加载项。我们有代码可以在收到来自云应用程序的消息时更新单元格的值。我发现,每当最小化电子表格窗口时,只要执行更新单元格的代码,单元格就不会更新 我们使用该属性来更新单元格的值。我已经验证了更新单元格值的代码实际上是在窗口最小化时执行的。问题在于,当电子表格最小化时,只要使用Range.Value2属性,单元格的值就不会更新 以下是更新单元格值的代码:C# 当电子表格窗口最小化时,如何让Excel VSTO加载项更新单元格?,c#,excel,vsto,excel-addins,C#,Excel,Vsto,Excel Addins,我目前正在为Excel开发VSTO加载项。我们有代码可以在收到来自云应用程序的消息时更新单元格的值。我发现,每当最小化电子表格窗口时,只要执行更新单元格的代码,单元格就不会更新 我们使用该属性来更新单元格的值。我已经验证了更新单元格值的代码实际上是在窗口最小化时执行的。问题在于,当电子表格最小化时,只要使用Range.Value2属性,单元格的值就不会更新 以下是更新单元格值的代码: private void OnLinkedCellValueChanged(object sender, IEn
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;
}
}
private void OnLinkedCellValueChanged(对象发送方,IEnumerable单元格)
{
foreach(单元中的单元链接模型单元)
{
工作表=获取工作表(cell.WorkSheetId);
如果(工作表==null)
{
继续;
}
范围=cell.GetRange();
如果(范围==null)
{
范围=(范围)工作表.Cells[cell.Row,cell.Column];
cell.SetRange(范围);
}
range.Value2=cell.CellValue;
}
}
我看到的是代码确实得到了执行,但是当设置Range.Value2时,单元格值没有更新,而电子表格窗口被最小化。有人能告诉我为什么会发生这种情况,并提供一个解决方法来更新单元格值吗?我可以通过使用用户@RandRandom在他们对我的问题的评论中发布的帖子来解决这个问题。可能发生的情况是,当Excel最小化时,布局渲染会暂停。在此期间对a值的任何更新都将更新对象,但不会更新屏幕。恢复电子表格的窗口并重新启用渲染后,将不会进行重新渲染。执行可能导致重新渲染的操作,例如滚动直到过时单元不再可见,然后向后滚动将导致使用正确的值渲染单元,因为对象本身实际上具有正确的值 为了以编程方式解决这个问题,我订阅了该活动。理想情况下,有一种方法可以使电子表格无效,从而导致我们可以在事件处理程序中使用的重新呈现,但我不知道有一种方法。我在事件处理程序中所做的是将属性设置为等于自身。设置此属性会导致重新渲染。代码可以在下面找到 在应用程序中的适当位置,订阅活动: 在事件处理程序中,将属性设置为自身:
private void OnWindowResize(Workbook Wb, Microsoft.Office.Interop.Excel.Window window)
{
Globals.ThisAddIn.Application.ScreenUpdating = Globals.ThisAddIn.Application.ScreenUpdating;
}
看一看:谢谢@RandRandom的链接。我想知道为什么会这样。你知道为什么会发生这种情况,为什么每次调整窗口大小时都要切换_Application.ScreenUpdate属性来解决这个问题?不,我从来没有想到,我很高兴找到了解决方案。我的猜测是,有一种形式的悬念布局渲染到位,当恢复窗口时,没有人费心更新布局-屏幕更新就是这样做的
private void OnWindowResize(Workbook Wb, Microsoft.Office.Interop.Excel.Window window)
{
Globals.ThisAddIn.Application.ScreenUpdating = Globals.ThisAddIn.Application.ScreenUpdating;
}