2017-01-31 3 views
0

Ich bin neu im C# -Topic (PHP-Hintergrund) und stoße ständig auf das gleiche Problem mit meinem Word-Plugin. Die Aufgabe besteht darin, eine Tabelle in zwei Teile aufzuteilen, wenn die Anzahl der Zeilen einen bestimmten Haltepunkt erreicht hat. Um das zu lösen, habe ich einfach die Tabelle geteilt, die Tabelle 2 mit exakt derselben Überschrift versehen, eine unsichtbare Tabelle mit zwei Spalten erstellt (sie müssen parallel sein), diese zwei geteilten Tabellen in Spalte 1,1 und 1,2 eingefügt. Dies funktioniert für eine einzelne Tabelle, aber wenn es zwei oder mehr gibt, stürzt es nur ohne Ausnahme ab. Das einzige, was ich weiß, ist, dass die Anwendung abstürzt, kurz bevor die erste Überschrift in der neuen Tabelle ausgefüllt wird. Vielleicht ein Performance-Problem mit 2 oder mehr Tabellen?VSTO Word-Plugin stürzt beim Teilen von zwei Tabellen ab

Aufgabe in Bildern

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

zu

+------------+------------+ +------------+------------+ 
| 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 | +------------+------------+ 
+------------+------------+  

und hier ist mein Code

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); 
       } 
      } 
     } 
    } 
} 
+0

Welche Codezeile, genau, löst den Absturz aus? Wenn Sie die Codeausführung kurz vor dem Absturz beenden, wo genau ist die SELECTION im Dokument? Können Sie die Aktion, die den Absturz verursacht hat, manuell ausführen? Mein Bauchgefühl ist, dass die Tabellen, die du erstellst, beschädigt sind ODER wo du versuchst, die neuen Tabellen einzufügen, ist keine gültige Position. Deinem Code fehlen nützliche Kommentare, zum Beispiel ist mir nicht klar, wie getInvisibleTable (tableHash); soll funktionieren ... –

Antwort

0

Das Problem der rekursiven Funktion getInvisibleTable war. Es ist notwendig, alle Tabellen zu durchlaufen, aber diese Funktion wartet nur auf long, so dass es unmöglich war, tiefer zu schleifen. Die Lösung sieht wie folgt aus:

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; 
} 

Ich freue mich, diese Funktion einfacher zu verwenden. (Z. B. optionalen Parameter deklarieren)