2

我现在尝试了大约 30 分钟来解决这个问题,但无济于事。

我得到了这个代码:

class BookMarkTest
{
    Application word;
    Document doc;

    public BookMarkTest()
    {
        word = new Application();
        doc = word.Documents.Open("C:\\Users\\Vipar\\Desktop\\TestSkabelon.docx");
        Console.WriteLine("BEFORE:\n");
        foreach (Bookmark b in doc.Bookmarks)
        {
            Console.WriteLine("Name: {0}\n", b.Name);
        }
        Console.WriteLine("Name: {0}, Text: {1}\n", doc.Bookmarks[2].Name, doc.Bookmarks[2].Range.Text);
        test(ref doc);
        Console.WriteLine("------------------\n");
        Console.WriteLine("AFTER:\n");
        foreach (Bookmark b in doc.Bookmarks)
        {
            Console.WriteLine("Name: {0}\n", b.Name);
        }
        Console.WriteLine("Name: {0}, Text: {1}\n", doc.Bookmarks[2].Name, doc.Bookmarks[2].Range.Text);
        doc = null;
        word = null;
    }

    // Fixed the code so it replaces bookmarks correctly rather than removing them.
    public void test(ref Document doc)
    {
        Dictionary<string, Bookmark> bookmarks = new Dictionary<string, Bookmark>();
        foreach(Bookmark b in doc.Bookmarks) {
            bookmarks.Add(b.Name, b);
        }
        BookMarkReplaceNative(bookmarks["Titel"], "Min nye titel");
    }

    internal void BookMarkReplaceNative(Bookmark bookmark, string newText)
    {
        object rng = bookmark.Range;
        string name = bookmark.Name;

        bookmark.Range.Text = newText;
        doc.Bookmarks.Add(name, rng);
    }
}

首先我检查是否所有的书签都在那里。有 3 个(我在做其他任何事情之前打印出来检查这个)所以数组应该是0 = KontraktStart, 1 = Signatur, 2 = Titel,但是当我打电话时,doc.Bookmarks[2].Name我得到Signatur而不是Titel. 我不明白为什么会这样。我曾尝试这样做doc.Bookmarks[3].Name,但这告诉我该元素不存在。出于某种原因,我虽然不能叫doc.Bookmarks[0].Name名字。就像一个元素消失了,什么都没有了。

我的方法也完全从数组test()中删除。我知道会发生这种情况,但是我该如何更换书签而不是完全删除它呢?当我查看我的文档时,我可以看到特定书签上的文本实际上发生了变化,但书签已被删除,这是不需要的。解决了这个问题。添加到代码片段TitleBookmarks

所以我的问题有两个:

  1. Bookmarks为什么在我操作集合之前元素就从集合中消失了?
  2. 如何替换书签而不是完全删除它?解决了这个问题。添加到代码片段

提前致谢!

4

0 回答 0