2012-05-23 17 views

risposta

5

L'SDK OpenXML fornisce la classe Lock e la LockingValues enumerazione per l'impostazione a livello di codice le opzioni:

  • Controllo dei contenuti non può essere cancellato e
  • contenuti non possono essere modificati

Così, per imposta queste due opzioni su "false" (LockingValues.Unlocked), cerca tutti gli elementi SdtElement nel documento e imposta il Val proprietà a LockingValues.Unlocked.

Il codice seguente mostra un esempio:

static void UnlockAllSdtContentElements() 
{ 
    using (WordprocessingDocument wordDoc = 
    WordprocessingDocument.Open(@"c:\temp\myword.docx", true)) 
    {   
    IEnumerable<SdtElement> elements = 
     wordDoc.MainDocumentPart.Document.Descendants<SdtElement>(); 

    foreach (SdtElement elem in elements) 
    { 
     if (elem.SdtProperties != null) 
     { 
     Lock l = elem.SdtProperties.ChildElements.First<Lock>(); 

     if (l == null) 
     {    
      continue; 
     } 

     if (l.Val == LockingValues.SdtContentLocked) 
     { 
      Console.Out.WriteLine("Unlock content element..."); 
      l.Val = LockingValues.Unlocked; 
     } 
     } 
    } 
    } 
} 

static void Main(string[] args) 
{ 
    UnlockAllSdtContentElements(); 
} 
1

Solo per quelli che copia questo codice, tenere a mente che se non ci sono blocchi associati al controllo dei contenuti, poi ci non sarà un blocco proprietà associata ad esso, quindi quando il codice esegue la seguente istruzione, restituirà un'eccezione poiché non è stato trovato alcun elemento:

Lock l = elem.SdtProperties.ChildElements.First();

Il modo per risolvere il problema è eseguire FirstOrDefault anziché First.

+0

Dovrebbe essere aggiunto come commento alla soluzione pertinente –

+0

Ciao @OriPrice, non posso commentare la soluzione poiché la mia reputazione è inferiore a 50. Saluti. –

Problemi correlati