代码之家  ›  专栏  ›  技术社区  ›  Chris

保存并操作表时Word挂起

  •  0
  • Chris  · 技术社区  · 6 年前

    我最近遇到了一个很奇怪的问题,我没想到能解决。但我做到了,现在我想分享这个解决方案。

    我看到的行为是,表操作经常会弄乱图形和挂起单词,以至于需要重新启动它,除非在更改停止挂起后将其解开。我发现的可重复的测试用例是:

    1. 创建或打开任何带有表的文档。
    2. 省钱两次。
    3. 使用弹出的控件插入新列。

    我的解决方案在保存过程中做了很多不同的事情,并且在我的日志中没有出现任何异常或任何显示任何错误的内容。

    这不是正常情况下发生的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Chris    6 年前

    为了找出原因,我开始删除大量代码并重新测试,以确定它是否有任何不同。

    我最终创建了这个MCVE:

    请注意,这是一个文档级模板项目。

    using System;
    using Microsoft.Office.Tools.Word;
    using Microsoft.Office.Interop.Word;
    
    namespace TableUndoBug
    {
        public partial class ThisDocument
        {
            private void ThisDocument_Startup(object sender, System.EventArgs e)
            {
                BeforeSave += ThisDocument_BeforeSave;
            }
    
            private void ThisDocument_BeforeSave(object sender, SaveEventArgs e)
            {
                try
                {
                    foreach (Table table in Tables)
                    {
                        int numRows = table.Rows.Count;
                        var c = table.Cell(numRows, 0); // this line is the culprit
                        // this call should be using 1, not 0, but it completes successfully anyway.
                        // if you change it, this bug disappears
                    }
                }
                catch (Exception)
                {
                }
            }
    
            private void ThisDocument_Shutdown(object sender, System.EventArgs e)
            {
            }
    
            #region VSTO Designer generated code
    
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InternalStartup()
            {
                this.Startup += new System.EventHandler(ThisDocument_Startup);
                this.Shutdown += new System.EventHandler(ThisDocument_Shutdown);
            }
    
            #endregion
        }
    }
    

    下面是测试的步骤(我还发现了更多的测试用例):

    这个示例项目演示了Word 2013/VSTO中的一个错误。

    要复制:

    1. 从Visual Studio运行它。

    2. 将文档保存到任何位置。

    3. 插入表。

    测试用例1:

    1. 再保存2次。

    2. 尝试使用悬停时弹出的控件插入列。

      图形将被弄乱,但它不会挂起。

    测试用例2:

    1. 使用表的上下文菜单添加标题(我认为这里重要的是样式应用程序)。
    2. 尝试使用悬停时弹出的控件插入列。

      图形会被弄乱,它会挂一段时间。

    测试用例3:

    1. 再保存2次。
    2. 使用快速访问工具栏中的“重做”按钮。

      图形会被弄乱,它会挂一段时间。