2013-05-01 19 views
9

Tytuł określa błąd, który otrzymuję. Próbuję ukryć cały tekst w dokumencie słowo przy użyciu OpenXML. Obecnie, kiedy próbuję dodać właściwości akapitu, otrzymuję powyższy błąd. Nie mogę znaleźć wiele informacji na temat tego błędu w Internecie.Nie można wstawić elementu "newChild" OpenXmlElement, ponieważ jest on częścią drzewa.

Kod, który zwraca błąd

 using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(mDoc_copy, true)) 
     { 
      // Manage namespaces to perform XPath queries. 
      NameTable nt = new NameTable(); 
      XmlNamespaceManager nsManager = new XmlNamespaceManager(nt); 
      nsManager.AddNamespace("w", wordmlNamespace); 

      // Get the document part from the package. 
      // Load the XML in the document part into an XmlDocument instance. 
      XmlDocument xdoc = new XmlDocument(nt); 
      xdoc.Load(wdDoc.MainDocumentPart.GetStream()); 

      MainDocumentPart main = wdDoc.MainDocumentPart; 

      IEnumerable<OpenXmlElement> elem = main.Document.Body.Descendants().ToList(); 
      Paragraph p; 
      ParagraphProperties pp = new ParagraphProperties(); 
      ParagraphMarkRunProperties prmp = new ParagraphMarkRunProperties(); 
      Vanish v = new Vanish(); 
      apprmp.AppendChild<Vanish>(v); 
      pp.AppendChild<ParagraphMarkRunProperties>(apprmp); 


      foreach (Paragraph para in main.Document.Body.Descendants<Paragraph>().ToList()) 
      { 


        para.ParagraphProperties = pp; 

      } 
     } 
+0

Musisz również dodać Vanish do właściwości 'Run', aby efekt zadziałał. – Flowerking

+0

Okej, więc czy muszę najpierw Zniknąć z każdego Biegu, a następnie znikać każdy akapit? lub czy w jakiś sposób dołączam właściwości run do obiektu Paragraph? – user1704863

Odpowiedz

25

Zazwyczaj błąd ten może być ustalony przez klonowanie cokolwiek węzeł powodującej wyjątek, a następnie wkładając że sklonowany wartość. Coś takiego:

LeftBorder leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin }; 
TopBorder topBorder = new TopBorder() { Style = BorderStyleValues.Thin }; 
RightBorder rightBorder = new RightBorder() { Style = BorderStyleValues.Thin }; 
BottomBorder bottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin }; 

Color color = new Color() { Auto = true, Rgb = rgbHexValue == string.Empty ? new HexBinaryValue("00000000") : new HexBinaryValue(rgbHexValue) }; 

leftBorder.Color = color; 
topBorder.Color = (Color)color.CloneNode(true); 
rightBorder.Color = (Color)color.CloneNode(true); 
bottomBorder.Color = (Color)color.CloneNode(true); 

Spowoduje to utworzenie jednej Color instancji, a następnie użyć tej samej instancji dla wszystkich granicach poprzez klonowanie oryginalnej instancji następnie wkładając ją.

+0

To był dokładnie problem, z którym miałem do czynienia, i to naprawiło to doskonale. Dzięki! –

+0

CloneNode! @amurra: Jesteś ratownikiem! – slayernoah