拆分两个表时 VSTO Word 插件崩溃

VSTO Word plugin crashes while splitting two tables

我是 C# 主题 (PHP-Background) 的新手,我的 Word-Plugin 经常遇到同样的问题。任务是,如果行数达到某个断点,则将 table 分成两部分。为了解决这个问题,我只是拆分了 table,将完全相同的标题添加到 table 2,创建了一个不可见的 table 两列(它们需要平行),粘贴了这两个拆分tables 在第 1,1 和 1,2 列中。这适用于单个 table,但如果有两个或更多,它只会崩溃而不会出现任何异常。我唯一知道的是,应用程序崩溃了,就在填充新 Table 中的第一个标题之前。也许 Performance-Problem 有 2 个或更多 tables?

图片中的任务

+------------+------------+
| Headline 1 | Headline 2 |
+------------+------------+
| Col 1,1    | Col 1,2    |
| Col 2,1    | Col 2,2    |
| Col 3,1    | Col 3,2    |
+------------+------------+

+------------+------------+    +------------+------------+
| Headline 1 | Headline 2 |    | Headline 1 | Headline 2 |
+------------+------------+    +------------+------------+
| Col 1,1    | Col 1,2    |    | Col 3,1    | Col 3,2    |
| Col 2,1    | Col 2,2    |    +------------+------------+
+------------+------------+    

这是我的代码

private long createInvisibleTable() {
    long timestamp = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
    Word.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
    doc.Paragraphs.SpaceAfter = 0;
    Word.Table newTable = doc.Tables.Add(Globals.ThisAddIn.Application.Selection.Range, 1, 2);
    newTable.AllowAutoFit = true;
    newTable.Descr = timestamp.ToString();
    newTable.Cell(1, 1).Range.Text = "1. Tabelle hier einfügen";
    newTable.Cell(1, 2).Range.Text = "2. Tabelle hier einfügen";
    return timestamp;
}


private Word.Table getInvisibleTable(long hash) {
    Word.Tables docTables = Globals.ThisAddIn.Application.ActiveDocument.Tables;
    foreach (Word.Table thisTable in docTables) {
        if (thisTable.Tables.Count > 0) {
            this.getInvisibleTable(hash);
        } else if (thisTable.Descr == hash.ToString()) {
            return thisTable;
        }
    }
    return null;
}


private void splitTables(Word.Tables tablesRec)
{
    foreach (Word.Table table in tablesRec)
    {
        if (table.Tables.Count > 0)
        {
            this.splitTables(table.Tables);
        }
        else
        {
            int schwellenwert = this.splitTableSchwellenwert;
            double breakPoint = schwellenwert;
            int counter = 0;

            if (table.Rows.Count > schwellenwert)
            {
                try
                {
                    breakPoint = 2 + (int)Math.Ceiling((decimal)(table.Rows.Count - 1) / 2);

                    Word.Table tableSplit = table.Split(breakPoint);

                    tableSplit.Range.Select();
                    Globals.ThisAddIn.Application.Selection.Collapse();
                    Globals.ThisAddIn.Application.Selection.InsertRowsAbove();

                    foreach (Word.Cell sourceTableCell in table.Rows[1].Cells)
                    {
                        counter++;
                        tableSplit.Cell(1, counter).Range.Text = sourceTableCell.Range.Text;
                    }

                    table.Select();
                    Globals.ThisAddIn.Application.Selection.Cut();
                    long tableHash = this.createInvisibleTable();
                    Word.Table thisTable = this.getInvisibleTable(tableHash);
                    thisTable.Cell(1, 1).Select();
                    Globals.ThisAddIn.Application.Selection.PasteAsNestedTable();

                    tableSplit.Select();
                    Globals.ThisAddIn.Application.Selection.Cut();
                    thisTable.Cell(1, 2).Select();
                    Globals.ThisAddIn.Application.Selection.PasteSpecial();
                }
                catch (Exception e)
                {
                    Debug.WriteLine("Source: \n" + e.Source);
                    Debug.WriteLine("\n\nMessage: \n" + e.Message);
                    Debug.WriteLine("\n\nStacktrace: " + e.StackTrace);
                }
            }
        }
    }
}

问题是递归函数getInvisibleTable。需要循环遍历所有的表,但是这个函数只等待一个long,所以不可能循环得更深。解决方案如下所示:

private Word.Table getInvisibleTable(long hash , Word.Tables tablesRec) {
    Word.Tables docTables = Globals.ThisAddIn.Application.ActiveDocument.Tables;
    foreach (Word.Table thisTable in docTables) {
        if (thisTable.Tables.Count > 0) {
            this.getInvisibleTable(hash, thisTable.Tables);
        } else if (thisTable.Descr == hash.ToString()) {
            return thisTable;
        }
    }
    return null;
}

我期待着让这个功能更容易使用。 (例如声明可选参数)