Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当电子表格窗口最小化时,如何让Excel VSTO加载项更新单元格?_C#_Excel_Vsto_Excel Addins - Fatal编程技术网

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

C# 当电子表格窗口最小化时,如何让Excel VSTO加载项更新单元格?,c#,excel,vsto,excel-addins,C#,Excel,Vsto,Excel Addins,我目前正在为Excel开发VSTO加载项。我们有代码可以在收到来自云应用程序的消息时更新单元格的值。我发现,每当最小化电子表格窗口时,只要执行更新单元格的代码,单元格就不会更新 我们使用该属性来更新单元格的值。我已经验证了更新单元格值的代码实际上是在窗口最小化时执行的。问题在于,当电子表格最小化时,只要使用Range.Value2属性,单元格的值就不会更新 以下是更新单元格值的代码: private void OnLinkedCellValueChanged(object sender, IEn

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

我们使用该属性来更新单元格的值。我已经验证了更新单元格值的代码实际上是在窗口最小化时执行的。问题在于,当电子表格最小化时,只要使用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;
    }
}
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;
}