Навигация с помощью курсора

Во время работы с документом, даже если он короткий или длинный, вам нужно будет перемещаться по документу. Навигация с виртуальным курсором представляет собой возможность навигации между различными узлами в документе.

В коротком документе перемещение по документу просто, так как вы можете перемещать точку вставки даже с помощью клавиш со стрелками клавиатуры или щелкнув мышью, чтобы найти точку вставки, где вы хотите. Но как только у вас есть большой документ, который имеет много страниц, эти основные методы будут недостаточными.

В этой статье объясняется, как перемещаться по документу и перемещаться с помощью виртуального курсора в разные его части.

Обнаружение текущей позиции курсора

Прежде чем начать процесс навигации по документу, вам нужно будет получить выбранный в настоящее время узел. Вы можете получить точное положение курсора на выбранном узле, используя CurrentNode собственность. Кроме того, вместо получения текущего узла вы можете получить выбранный в настоящее время абзац или выбранный в настоящее время раздел, используя CurrentParagraph и CurrentSection свойств.

Любые операции вставки, которые вы выполняете, используя DocumentBuilder Он будет вставлен перед CurrentNode. Если текущий абзац пуст или курсор расположен непосредственно перед концом абзаца, CurrentNode Возвращает нуль.

Методы навигации в документе

Когда вы редактируете текст, важно знать, как перемещаться по документу и куда именно в нем двигаться. Aspose.Words позволяет перемещаться по документу и перемещаться по его различным разделам и частям – это аналогично функциональности навигационной панели Microsoft Word Перейти на страницу или заголовок в документе Word без прокрутки.

Основной метод заключается в том, чтобы иметь возможность перемещать положение курсора к определенному узлу в вашем документе, вы можете достичь этого, используя MoveTo метод.

Следующий пример кода показывает, как перемещать DocumentBuilder Для разных узлов в документе:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder.StartBookmark("MyBookmark");
builder.Writeln("Bookmark contents.");
builder.EndBookmark("MyBookmark");
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkEnd, builder.CurrentParagraph.FirstChild);
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder.MoveToBookmark("MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkStart, builder.CurrentParagraph.FirstChild);
// We can move the builder to an individual node,
// which in this case will be the first node of the first paragraph, like this.
builder.MoveTo(doc.FirstSection.Body.FirstParagraph.GetChildNodes(NodeType.Any, false)[0]);
Assert.AreEqual(NodeType.BookmarkStart, builder.CurrentNode.NodeType);
Assert.IsTrue(builder.IsAtStartOfParagraph);
// A shorter way of moving the very start/end of a document is with these methods.
builder.MoveToDocumentEnd();
Assert.IsTrue(builder.IsAtEndOfParagraph);
builder.MoveToDocumentStart();
Assert.IsTrue(builder.IsAtStartOfParagraph);

Помимо основного MoveTo Метод, есть более конкретные.

Переход к началу или концу документа

Вы можете перейти к началу или концу документа, используя MoveToDocumentStart и MoveToDocumentEnd методы.

Следующий пример кода показывает, как перемещать положение курсора в начало или конец документа:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Move the cursor position to the beginning of your document.
builder.MoveToDocumentStart();
Console.WriteLine("\nThis is the beginning of the document.");
// Move the cursor position to the end of your document.
builder.MoveToDocumentEnd();
Console.WriteLine("\nThis is the end of the document.");

Навигация с закладками

Вы можете пометить место, которое хотите найти, и легко переехать туда. Вы можете вставить в документ столько закладок, сколько захотите, а затем перемещаться по ним, идентифицируя закладки с уникальными именами. Вы можете перейти к закладке, используя MoveToBookmark метод.

Следующие примеры кода показывают, как перемещать позицию курсора в закладку:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder.StartBookmark("MyBookmark");
builder.Writeln("Bookmark contents.");
builder.EndBookmark("MyBookmark");
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkEnd, builder.CurrentParagraph.FirstChild);
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder.MoveToBookmark("MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
Assert.AreEqual(doc.Range.Bookmarks[0].BookmarkStart, builder.CurrentParagraph.FirstChild);
// We can move the builder to an individual node,
// which in this case will be the first node of the first paragraph, like this.
builder.MoveTo(doc.FirstSection.Body.FirstParagraph.GetChildNodes(NodeType.Any, false)[0]);

Навигация к столовым клеткам

Вы можете перейти в столовую камеру, используя MoveToCell метод. Этот метод позволит вам перемещать курсор в любую ячейку в определенной таблице. Кроме того, можно указать индекс для перемещения курсора в любое положение или заданный символ в ячейке внутри MoveToCell метод.

Следующий пример кода показывает, как перемещать положение курсора в определенную ячейку таблицы:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document(MyDir + "Tables.docx");
DocumentBuilder builder = new DocumentBuilder(doc);
// Move the builder to row 3, cell 4 of the first table.
builder.MoveToCell(0, 2, 3, 0);
builder.Write("\nCell contents added by DocumentBuilder");
Table table = (Table)doc.GetChild(NodeType.Table, 0, true);
Assert.AreEqual(table.Rows[2].Cells[3], builder.CurrentNode.ParentNode.ParentNode);
Assert.AreEqual("Cell contents added by DocumentBuilderCell 3 contents\a", table.Rows[2].Cells[3].GetText().Trim());

Навигация в поле

Вы можете перейти в определенное поле в вашем документе, используя MoveToField метод. Кроме того, вы можете перейти к определенному полю слияния, используя MoveToMergeField метод.

Следующий пример кода показывает, как переместить курсор конструктора документов в определенное поле:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Insert a field using the DocumentBuilder and add a run of text after it.
Field field = builder.InsertField("MERGEFIELD field");
builder.Write(" Text after the field.");
// The builder's cursor is currently at end of the document.
Assert.Null(builder.CurrentNode);
// We can move the builder to a field like this, placing the cursor at immediately after the field.
builder.MoveToField(field, true);
// Note that the cursor is at a place past the FieldEnd node of the field, meaning that we are not actually inside the field.
// If we wish to move the DocumentBuilder to inside a field,
// we will need to move it to a field's FieldStart or FieldSeparator node using the DocumentBuilder.MoveTo() method.
Assert.AreEqual(field.End, builder.CurrentNode.PreviousSibling);
builder.Write(" Text immediately after the field.");

Навигация к заголовку или подносу

Вы можете перейти к началу заголовка или футера, используя MoveToHeaderFooter метод

Следующий пример кода показывает, как перемещать курсор сборщика документов в заголовок или нижний колонтитул документа:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Specify that we want headers and footers different for first, even and odd pages.
builder.PageSetup.DifferentFirstPageHeaderFooter = true;
builder.PageSetup.OddAndEvenPagesHeaderFooter = true;
// Create the headers.
builder.MoveToHeaderFooter(HeaderFooterType.HeaderFirst);
builder.Write("Header for the first page");
builder.MoveToHeaderFooter(HeaderFooterType.HeaderEven);
builder.Write("Header for even pages");
builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);
builder.Write("Header for all other pages");
// Create two pages in the document.
builder.MoveToSection(0);
builder.Writeln("Page1");
builder.InsertBreak(BreakType.PageBreak);
builder.Writeln("Page2");
doc.Save(ArtifactsDir + "AddContentUsingDocumentBuilder.MoveToHeadersFooters.docx");

Перейти к разделу или абзацу

Вы можете перейти к определенному разделу или абзацу, используя MoveToParagraph или MoveToSection методы. Кроме того, можно указать индекс для перемещения курсора в любую позицию или заданный символ в абзаце внутри MoveToParagraph метод.

Следующий пример кода показывает, как перейти к определенному разделу и определенному абзацу в документе:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET
Document doc = new Document();
doc.AppendChild(new Section(doc));
// Move a DocumentBuilder to the second section and add text.
DocumentBuilder builder = new DocumentBuilder(doc);
builder.MoveToSection(1);
builder.Writeln("Text added to the 2nd section.");
// Create document with paragraphs.
doc = new Document(MyDir + "Paragraphs.docx");
ParagraphCollection paragraphs = doc.FirstSection.Body.Paragraphs;
Assert.AreEqual(22, paragraphs.Count);
// When we create a DocumentBuilder for a document, its cursor is at the very beginning of the document by default,
// and any content added by the DocumentBuilder will just be prepended to the document.
builder = new DocumentBuilder(doc);
Assert.AreEqual(0, paragraphs.IndexOf(builder.CurrentParagraph));
// You can move the cursor to any position in a paragraph.
builder.MoveToParagraph(2, 10);
Assert.AreEqual(2, paragraphs.IndexOf(builder.CurrentParagraph));
builder.Writeln("This is a new third paragraph. ");
Assert.AreEqual(3, paragraphs.IndexOf(builder.CurrentParagraph));