2011-02-10 15 views
9

Il codice C# .net consigliato per sostituire un segnalibro con testo appare molto semplice e ho visto lo stesso codice su tutta la rete su tanti siti Web (tuttavia, non è possibile superare l'erroreL'intervallo non può essere cancellato. in Microsoft.Office.Interop.Word.Range.set_Text (String prop)

L'intervallo non può essere eliminato. a Microsoft.Office.Interop.Word.Range.set_Text (String prop)

(sto usando CONTRO 2010 con Windows 7 e Word 2010 14,0).

Il mio codice:

private void ReplaceBookmarkText(Microsoft.Office.Interop.Word.Document doc, string bookmarkName, string text) 
     { 
      try 
      { 
       if (doc.Bookmarks.Exists(bookmarkName)) 
       { 
        Object name = bookmarkName; 
        // throws error 'the range cannot be deleted' 
        doc.Bookmarks.get_Item(ref name).Range.Text = text; 
       } 
      } 

risposta

8

Invece di alterare la gamma direttamente, provare qualcosa di simile:

Bookmark bookmark = doc.Bookmarks.get_Item(ref name); 

//Select the text. 
bookmark.Select(); 

//Overwrite the selection. 
wordApp.Selection.TypeText(text); 

Ad es utilizzare l'istanza dell'applicazione Word per modificare il documento.

+0

Questo funziona, non ti capita di avere l'alternativa Late Binding? – Schuere

1
if (doc.Bookmarks.Exists(name)) 
    { 
     Word.Bookmark bm = doc.Bookmarks[name]; 
     bm.Range.Text = text 
    } 

Questo funziona, ma ricorda, se si sostituisce l'intero testo di un segnalibro esistente in questo modo, il segnalibro scompare. Ogni volta che sostituisci il primo carattere di un segnalibro esistente (anche se lo sostituisci con quello che era già presente) il segnalibro viene consumato. Quello che ho trovato funziona (anche se non sostengo che questo è il metodo approvato da Microsoft) è qualcosa del genere:

if (doc.Bookmarks.Exists(name)) 
    { 
     Word.Bookmark bm = doc.Bookmarks[name]; 
     Word.Range range = bm.Range.Duplicate; 
     bm.Range.Text = text;     // Bookmark is deleted, range is collapsed 
     range.End = range.Start + text.Length; // Reset range bounds 
     doc.Bookmarks.Add(name, range);   // Replace bookmark 
    } 
+0

Ciò genera ancora l'errore "L'intervallo non può essere eliminato" COMException – Schuere

+0

In base a quale circostanza viene lanciata la COMException? –

+0

Campo modulo testo con le impostazioni del campo Segnalibro. ==> scoperto Office non crea un segnalibro corretto quando si imposta questo campo. Hai ancora bisogno di fare INSERT => Segnalibro => "Seleziona segnalibro" => Aggiungi. Per creare un segnalibro corretto (Sigh ...) + EDIT: aggiornerò questa risposta poiché è corretta. – Schuere