[英]How can I get my Excel VSTO Add-in to update cells when the spreadsheet window is minimized?
我目前正在為 Excel 開發 VSTO 插件。 我們的代碼可以在收到來自雲應用程序的消息時更新單元格的值。 我發現每當電子表格 window 最小化時,只要執行更新單元格的代碼就不會更新單元格。
我們使用Range.Value2屬性來更新單元格的值。 我已經驗證,只要 window 最小化,更新單元格值的代碼實際上就會被執行。 問題是,當電子表格最小化時,只要使用 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 而電子表格 window 最小化時,單元格值沒有更新。 誰能告訴我為什么會發生這種情況並提供解決方法來更新單元格值?
通過使用用戶@RandRandom 在他們對我的問題的評論中發布的鏈接,我能夠解決這個問題。 可能發生的情況是,當 Excel 最小化時,布局渲染被暫停。 在此期間對Range值的任何更新都會更新Range object,但不會更新屏幕。 恢復電子表格的 window 並重新打開渲染后,不會進行重新渲染。 執行會導致重新渲染的操作,例如滾動直到舊單元格不再可見,然后向后滾動將導致單元格以正確的值呈現,因為Range object 本身實際上具有正確的值。
為了以編程方式解決此問題,我訂閱了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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.