私はこれを約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()
削除します。そうなることはわかっていましたが、ブックマークを完全に削除するのではなく、ブックマークを置き換えるにはどうすればよいでしょうか? ドキュメントを見ると、特定のブックマークのテキストが実際に変更されていることがわかりますが、ブックマークは削除されていますが、これは望ましくありません。これを修正しました。コード スニペットに追加Title
Bookmarks
だから私の質問は2つあります:
Bookmarks
コレクションを操作する前に、コレクションから要素が消えるのはなぜですか?- ブックマークを完全に削除するのではなく、置き換えるにはどうすればよいですか? これを修正しました。コード スニペットに追加
前もって感謝します!