2014-11-04 52 views
0

目前我正在使用Word.dotx文件,這些文件包含幾個正在被c#程序修改的書籤。單詞自動化後期綁定替換書籤返回TargetinvocationException'範圍不能被刪除'

對於品牌重塑項目,我需要增加幾個新的書籤領域和我的前任代碼做參考文本窗體域原有控制辦公室內Word 2010中

我創建一個新的文字型窗體域與字段設置書籤指出到TestBookmark1。我已經知道某個文本表單字段的書籤名可以包含最多20個字符的錯誤。

當我運行測試代碼時,現有書籤在新書籤上崩潰時被完全替換。我收到這裏唯一的例外是「範圍不能被刪除

被用於替換書籤的代碼去如下:

public void ReplaceBookmark(string bookmarkName, string text) 
    { 
     try 
     { 
      var bookmarks = GetProperty("Bookmarks", _wordDoc); //worddoc is the Word.Document equivalent in late binding 
      var exists = InvokeMember("Exists", 
       bookmarks, 
       new object[] 
       { 
        bookmarkName 
       }) != null && (bool)InvokeMember("Exists", 
        bookmarks, 
        new object[] 
        { 
         bookmarkName 
        }); 
      if (!exists) 
       return; 
      var bookmark = InvokeMember("Item", 
       bookmarks, 
       new object[] 
       { 
        bookmarkName 
       }); 

      var range = GetProperty("Range", bookmark); 
      SetProperty("Text", range, text); 

      InvokeMember("Add", 
       bookmarks, 
       new[] 
       { 
        bookmarkName, range 
       }); 
     } 
     catch 
     { 
      CloseWord(false); 
      throw; 
     } 
    } 

例外獲取的在的SetProperty拋出(「文本」 ,範圍,文字);

private static void SetProperty(string propertyName, object instance, object value) 
    { 
     if (instance == null) 
      return; 
     var type = instance.GetType(); 
     type.InvokeMember(propertyName, 
      BindingFlags.SetProperty, 
      null, 
      instance, 
      new[] 
      { 
       value 
      }); 
    } 

當更深入這裏它屬於type.InvokeMember函數。

我已經看到了一個同樣的解決方案Here,但是這個例子使用了早期的綁定原則,我因公司原因不能使用。

這給我留下了以下問題:

  • 我是添加書籤錯誤,還是我只是忘了點什麼?
  • 爲什麼我得到「範圍不能刪除例外」?
  • 當我發現這個特定的錯誤,是否有另一種方法來取代書籤?

在此先感謝

回答

0

我發現它,也許另一個Office騙局......

添加一個新的文字型窗體域時,你必須添加的屬性的選項。在字段設置中,您可以設置書籤。

然而這並沒有完成書籤thingy。

設置你仍然需要去

插入選項卡=>工具組=>書籤=文字型窗體域屬性後>選擇正確的書籤(標準正確高亮顯示),然後按添加。

這聽起來很愚蠢,但我顯然沒有做最後的步驟。

迎接

+0

這樣做的原因是,默認情況下,書籤名稱是內部的域代碼。您可以通過查看域代碼來查看(Alt + F9)。這對於表單字段功能來說工作得很好。但是,當您嘗試使用書籤名稱並刪除範圍時,這是不可能的,因爲它是INSIDE表單字段代碼。這就是爲什麼選擇整個表單域並將書籤名稱應用於該字段的原因。您還應該能夠通過使用FormField對象而不是書籤對象來完成您的目的。 – 2015-12-15 18:04:36