2011-02-10 27 views
9

Mã C# .net được đề xuất để thay thế một dấu trang bằng văn bản xuất hiện rất thẳng về phía trước và tôi đã thấy cùng một mã trên toàn bộ mạng trên rất nhiều trang web (kể cả của bạn, từ bài đăng vào tháng 9 năm 2009) tuy nhiên, tôi không thể vượt qua lỗiKhông thể xóa phạm vi. tại Microsoft.Office.Interop.Word.Range.set_Text (String prop)

Không thể xóa phạm vi. tại Microsoft.Office.Interop.Word.Range.set_Text (String prop)

(Tôi đang sử dụng VS 2010 với Windows 7 và Word 2010 14.0).

Mã của tôi:

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

Trả lời

8

Thay vì thay đổi phạm vi trực tiếp, hãy thử một cái gì đó như:

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

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

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

Ví dụ: sử dụng cá thể ứng dụng Word của bạn để thay đổi tài liệu thay thế.

+0

Công trình này, bạn không có thay thế Ràng buộc muộn? – Schuere

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

Điều này hoạt động nhưng hãy nhớ, nếu bạn thay thế toàn bộ văn bản của dấu trang hiện có theo cách này, dấu trang sẽ biến mất. Bất cứ lúc nào bạn thay thế ký tự đầu tiên của một dấu trang hiện có (ngay cả khi bạn thay thế nó bằng những gì đã có) dấu trang được tiêu thụ. Những gì tôi đã tìm thấy công trình (mặc dù tôi không tuyên bố đây là phương pháp được Microsoft chấp thuận) là một cái gì đó như thế này:

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

Điều này sẽ vẫn ném lỗi "Phạm vi không thể bị xóa" COMException – Schuere

+0

Trong trường hợp nào điều này ném COMException? –

+0

Trường biểu mẫu văn bản có cài đặt trường Dấu trang. ==> phát hiện ra Office không tạo dấu trang chính xác khi thiết lập trường này. Bạn vẫn cần phải làm INSERT => Bookmark => "Chọn bookmark" => Add. Để tạo một bookmark chính xác (Sigh ...) + EDIT: Tôi sẽ upvote câu trả lời này vì nó là chính xác. – Schuere

Các vấn đề liên quan