Навигация с курсора

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

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

Тази статия обяснява как да се придвижвате в документ и да навигирате с виртуален курсор до различни части от него.

Откриване На Текущата Позиция На Курсора

Преди да започнете процеса на навигиране във вашия документ, ще трябва да получите възела, който е избран в момента. Можете да получите точната позиция на курсора в избран възел, като използвате свойството 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-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder->StartBookmark(u"MyBookmark");
builder->Writeln(u"Bookmark contents.");
builder->EndBookmark(u"MyBookmark");
// The node that the DocumentBuilder is currently at is past the boundaries of the bookmark.
ASSERT_EQ(doc->get_Range()->get_Bookmarks()->idx_get(0)->get_BookmarkEnd(), builder->get_CurrentParagraph()->get_FirstChild());
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder->MoveToBookmark(u"MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
ASSERT_EQ(doc->get_Range()->get_Bookmarks()->idx_get(0)->get_BookmarkStart(), builder->get_CurrentParagraph()->get_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->get_FirstSection()->get_Body()->get_FirstParagraph()->GetChildNodes(NodeType::Any, false)->idx_get(0));
ASSERT_EQ(NodeType::BookmarkStart, builder->get_CurrentNode()->get_NodeType());
ASSERT_TRUE(builder->get_IsAtStartOfParagraph());
// A shorter way of moving the very start/end of a document is with these methods.
builder->MoveToDocumentEnd();
ASSERT_TRUE(builder->get_IsAtEndOfParagraph());
builder->MoveToDocumentStart();
ASSERT_TRUE(builder->get_IsAtStartOfParagraph());

Но освен основния MoveTo метод, има и по-специфични.

Придвижване до началото или края на документ

Можете да отидете до началото или края на документа, като използвате методите MoveToDocumentStart и MoveToDocumentEnd.

Следващият пример за код показва как да преместите позицията на курсора в началото или края на документ:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"Document.docx");
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Move the cursor position to the beginning of your document.
builder->MoveToDocumentStart();
builder->Writeln(u"This is the beginning of the document.");
// Move the cursor position to the end of your document.
builder->MoveToDocumentEnd();
builder->Writeln(u"This is the end of the document.");

Навигация С Отметки

Можете лесно да маркирате място, което искате да намерите и да се преместите отново. Можете да вмъкнете толкова отметки във вашия документ, колкото искате, и след това да се придвижвате през тях, като идентифицирате отметките с уникални имена. Можете да преминете към отметка, като използвате метода MoveToBookmark.

Следните примери за код показват как да преместите позицията на курсора в отметка:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Start a bookmark and add content to it using a DocumentBuilder.
builder->StartBookmark(u"MyBookmark");
builder->Writeln(u"Bookmark contents.");
builder->EndBookmark(u"MyBookmark");
// If we wish to revise the content of our bookmark with the DocumentBuilder, we can move back to it like this.
builder->MoveToBookmark(u"MyBookmark");
// Now we're located between the bookmark's BookmarkStart and BookmarkEnd nodes, so any text the builder adds will be within it.
ASSERT_EQ(doc->get_Range()->get_Bookmarks()->idx_get(0)->get_BookmarkStart(), builder->get_CurrentParagraph()->get_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->get_FirstSection()->get_Body()->get_FirstParagraph()->GetChildNodes(NodeType::Any, false)->idx_get(0));
ASSERT_EQ(NodeType::BookmarkStart, builder->get_CurrentNode()->get_NodeType());

Придвижете се до клетките на таблицата

Можете да преминете към клетка на таблица, като използвате метода MoveToCell. Този метод ще ви позволи да навигирате курсора във всяка клетка в определена таблица. Освен това можете да зададете индекс, за да преместите курсора на всяка позиция или определен знак в клетка в рамките на метода MoveToCell.

Следващият пример за код показва как да преместите позицията на курсора в определена клетка на таблица:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>(inputDataDir + u"Tables.docx");
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Move the builder to row 3, cell 4 of the first table.
builder->MoveToCell(0, 2, 3, 0);
builder->Write(u"\nCell contents added by DocumentBuilder");
auto table = System::DynamicCast<Tables::Table>(doc->GetChild(NodeType::Table, 0, true));
ASSERT_EQ(table->get_Rows()->idx_get(2)->get_Cells()->idx_get(3), builder->get_CurrentNode()->get_ParentNode()->get_ParentNode());
ASSERT_EQ(table->get_Rows()->idx_get(2)->get_Cells()->idx_get(2)->GetText().Trim(), u"Cell contents added by DocumentBuilderCell 3 contents\a");

Навигиране до поле

Можете да преминете към конкретно поле във вашия документ, като използвате метода MoveToField. Освен това можете да преминете към конкретно поле за обединяване, като използвате метода MoveToMergeField.

Следващият пример за код показва как да преместите курсора на конструктора на документи в конкретно поле:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Insert a field using the DocumentBuilder and add a run of text after it.
auto field = builder->InsertField(u"MERGEFIELD field");
builder->Write(u" Text after the field.");
// The builder's cursor is currently at end of the document.
ASSERT_EQ(builder->get_CurrentNode(), nullptr);
// 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_EQ(field->get_End(), builder->get_CurrentNode()->get_PreviousSibling());
builder->Write(u" Text immediately after the field.");

Навигиране до горен или долен колонтитул

Можете да преминете към началото на горен или долен колонтитул, като използвате метода MoveToHeaderFooter.

Следващият пример за код показва как да преместите курсора на конструктора на документи в горен или долен колонтитул на документ:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = System::MakeObject<Document>();
auto builder = System::MakeObject<DocumentBuilder>(doc);
// Specify that we want headers and footers different for first, even and odd pages.
builder->get_PageSetup()->set_DifferentFirstPageHeaderFooter(true);
builder->get_PageSetup()->set_OddAndEvenPagesHeaderFooter(true);
// Create the headers.
builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
builder->Write(u"Header for the first page");
builder->MoveToHeaderFooter(HeaderFooterType::HeaderEven);
builder->Write(u"Header for even pages");
builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);
builder->Write(u"Header for all other pages");
// Create two pages in the document.
builder->MoveToSection(0);
builder->Writeln(u"Page1");
builder->InsertBreak(BreakType::PageBreak);
builder->Writeln(u"Page2");
System::String outputPath = outputDataDir + u"DocumentBuilderMovingCursor.HeadersAndFooters.doc";
doc->Save(outputPath);

Придвижване до раздел или абзац

Можете да преминете към конкретен раздел или абзац, като използвате методите MoveToParagraph или MoveToSection. Освен това можете да зададете индекс, за да преместите курсора на всяка позиция или определен знак в абзац в рамките на метода MoveToParagraph.

Следващият пример за код показва как да преминете към конкретен раздел и конкретен абзац в документ:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
// Create a blank document and append a section to it, giving it two sections.
auto doc = System::MakeObject<Document>();
doc->AppendChild(System::MakeObject<Section>(doc));
// Move a DocumentBuilder to the second section and add text.
auto builder = System::MakeObject<DocumentBuilder>(doc);
builder->MoveToSection(1);
builder->Writeln(u"Text added to the 2nd section.");
// Create document with paragraphs.
auto doc = System::MakeObject<Document>(inputDataDir + u"Paragraphs.docx");
auto paragraphs = doc->get_FirstSection()->get_Body()->get_Paragraphs();
ASSERT_EQ(paragraphs->get_Count(), 22);
// 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.
auto builder = System::MakeObject<DocumentBuilder>(doc);
ASSERT_EQ(paragraphs->IndexOf(builder->get_CurrentParagraph()), 0);
// You can move the cursor to any position in a paragraph.
builder->MoveToParagraph(0, 14);
ASSERT_EQ(paragraphs->IndexOf(builder->get_CurrentParagraph()), 2);
builder->Writeln(u"This is a new third paragraph. ");
ASSERT_EQ(paragraphs->IndexOf(builder->get_CurrentParagraph()), 3);