我最近在Word中遇到了一个非常奇怪的问题,而且我没想到能够解决。但是我做到了,现在我想分享该解决方案。
我看到的行为是表操作经常会弄乱图形并挂起单词,以至于需要重新启动它,除非一旦更改停止就取消了更改。我发现可重现的测试用例是:
我的解决方案在保存期间做了很多不同的事情,并且没有异常或日志中出现任何表明错误的信息。
在普通Word中没有发生这种情况。
答案 0 :(得分:1)
为找出原因,我开始删除大量代码,然后重新测试以确定它们是否有作用。
我最终创建了此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中的错误。
要复制:
从Visual Studio运行它。
将文档保存在任何地方。
插入表格。
测试案例1:
再次保存2次。
尝试使用悬停时弹出的控件插入列。
图形会混乱,但不会挂起。
测试案例2:
- 使用表格的上下文菜单添加标题(我认为这里重要的是样式应用程序)。
- 再次保存2次。
尝试使用悬停时弹出的控件插入列。
图形将被弄乱,并且将挂起一会儿。
测试案例3:
- 再次保存2次。
- 使用快速访问工具栏中的撤消按钮。
使用快速访问工具栏中的重做按钮。
图形将被弄乱,并且将挂起一会儿。
解决方案就在代码中:检查应该从1开始的从0开始的索引。该API可能会在此处失败,但由于某种原因它不会失败。