2012-09-18 100 views
0

這是我第一次問一個問題在這裏所以這裏有雲:Word加載搜索永遠循環

我在尋找,有一個Word文檔中文字「標題1」或「標題2」風格的名字。一旦找到,我將爲該文本的開頭和文檔的結尾設置一個新的範圍,並調用一個方法來查找該範圍中的第一個表格,如果第二列中有文本,則在第一列中找到第一個表格。現在我的問題發生在我的代碼找到完全匹配的第一條記錄時。一切正常,但Find.Execute進入永久循環,並不斷找到相同的文本。我希望它繼續搜索,直到文檔結束。這裏是我的代碼,並在此先感謝:

public void TextFind(object findText, string reqCode) 
    { 
     Document doc = Application.ActiveDocument; 
     Range docRange = doc.Sections[1].Range; 
     var intCount = 0; 
     docRange.SetRange(0, docRange.Characters.Count); 
     if (findText == null) throw new ArgumentNullException("findText"); 
     docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop); 
     while (docRange.Find.Found) 
     { 
      intCount++; 
      Style style = docRange.get_Style(); 
      var styleName = style.NameLocal; 
      if (styleName == "Heading 1" || styleName == "Heading 2") 
      { 
       var endRange = doc.Sections[1].Range; 
       var docRange2 = docRange; 
       docRange2.SetRange(docRange.Start, endRange.End); 
       ApplyNumberingToTable(docRange2, reqCode); 
      } 
      docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop); 
     } 

     MessageBox.Show(intCount.ToString()); 
    } 

intCountMessageBox是由我來診斷問題的一種嘗試。

嘗試二號包括了:

所以我仍然被卡住,我試圖將搜索範圍添加到列表中,並運行在列表中的foreach,但每次的範圍內改變參考該範圍在列表中也會更改。我不能爲我的生活弄清楚t5o如何在我的while循環中實例化Range。以下是我的代碼:

public void TextFind(object findText, string reqCode) 
    { 
     Document doc = Application.ActiveDocument; 
     Range docRange = doc.Sections[1].Range; 
     var intCount = 0; 
     if (findText == null) throw new ArgumentNullException("findText"); 
     var rangelist = new List<Range>(); 
     var i = 0; 
     while (docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop)) 
     { 
      rangelist = new List<Range> {docRange}; 
      intCount++; 
     } 
     foreach (var range in rangelist) 
     { 
      Style style = range.get_Style(); 
      var styleName = style.NameLocal; 
      if (styleName != "Heading 1" && styleName != "Heading 2") continue; 
      var endRange = doc.Sections[1].Range; 
      range.SetRange(range.Start, endRange.End); 
      ApplyNumberingToTable(range, reqCode); 
     } 
     if (intCount == 0) return; 
     MessageBox.Show(rangelist.ToString()); 
    } 

仍在尋找解決方法。 謝謝,

回答

0

根據文檔here,該方法本身返回一個布爾值是否已經成功找到搜索。也許你應該捕獲這個變量,並用它來爲你聲明而不是Found屬性。我目前無法測試這個;今天晚些時候會返回結果。

也許嘗試:

 while (docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop)) 
     { 
      intCount++; 
      Style style = docRange.get_Style(); 
      var styleName = style.NameLocal; 
      if (styleName == "Heading 1" || styleName == "Heading 2") 
      { 
       var endRange = doc.Sections[1].Range; 
       var docRange2 = docRange; 
       docRange2.SetRange(docRange.Start, endRange.End); 
       ApplyNumberingToTable(docRange2, reqCode); 
      } 
      docRange.Find.Execute(findText, Forward: true, Wrap: WdFindWrap.wdFindStop); 
     } 
+0

我試過,但無濟於事。循環中的find.execute會跳過第二個結果,在我的測試中,它使用標題1樣式的字符串。如果我刪除了find.execute,循環仍會掛起滿足if語句的第一個結果。將存儲在數組中工作的所有範圍,然後調用數組中每個範圍的ApplyNumberingToTable可能工作? – NutsPanther