Navigare cu Cursor

În timp ce lucrați cu un document, chiar dacă este unul scurt sau lung, va trebui să navigați prin documentul dvs. Navigarea cu un cursor virtual reprezintă capacitatea de a naviga între diferite noduri dintr-un document.

Într-un document scurt, deplasarea într-un document este simplă, deoarece puteți muta punctul de inserare chiar și folosind tastele săgeată ale tastaturii sau făcând clic pe mouse pentru a localiza punctul de inserare oriunde doriți. Dar odată ce aveți un document mare care are multe pagini, aceste tehnici de bază vor fi insuficiente.

Acest articol explică cum să vă deplasați într-un document și să navigați cu un cursor virtual în diferite părți ale acestuia.

Detectarea Poziției Curente A Cursorului

Înainte de a începe procesul de navigare prin documentul dvs., va trebui să obțineți nodul selectat în prezent. Puteți obține poziția exactă a cursorului la un nod selectat utilizând proprietatea CurrentNode. În plus, în loc să obțineți nodul curent, puteți obține paragraful selectat în prezent sau secțiunea selectată în prezent utilizând proprietățile CurrentParagraph și CurrentSection.

Orice operații de inserare pe care le efectuați folosind DocumentBuilder vor fi inserate înainte de CurrentNode. Când paragraful curent este gol sau cursorul este poziționat chiar înainte de sfârșitul paragrafului, CurrentNode returnează nullptr.

Metode de navigare într-un Document

Când editați text, este important să știți cum să navigați în documentul dvs. și unde să vă deplasați exact în el. Aspose.Words vă permite să vă deplasați într – un document și să navigați la diferitele sale secțiuni și părți-acest lucru este similar cu funcționalitatea panoului de navigare din Microsoft Word pentru a accesa o pagină sau un titlu dintr-un document Word fără a derula.

Metoda principală este să puteți muta poziția cursorului într-un anumit nod din documentul dvs., puteți realiza acest lucru utilizând metoda MoveTo.

Următorul exemplu de cod arată cum să mutați DocumentBuilder la diferite noduri dintr-un document:

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());

Dar, pe lângă metoda de bază MoveTo, există și altele mai specifice.

Puteți merge la începutul sau la sfârșitul documentului utilizând metodele MoveToDocumentStart și MoveToDocumentEnd.

Următorul exemplu de cod arată cum să mutați poziția cursorului la începutul sau la sfârșitul unui document:

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.");

Puteți marca un loc pe care doriți să îl găsiți și să îl mutați din nou cu ușurință. Puteți introduce câte marcaje doriți în document, apoi navigați prin ele identificând marcajele cu nume unice. Puteți trece la un marcaj utilizând metoda MoveToBookmark.

Următoarele exemple de cod arată cum să mutați o poziție a cursorului într-un marcaj:

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());

Puteți trece la o celulă de tabel utilizând metoda MoveToCell. Această metodă vă va permite să navigați cursorul în orice celulă dintr-un anumit tabel. În plus, puteți specifica un index pentru a muta cursorul în orice poziție sau caracter specificat într-o celulă din metoda MoveToCell.

Următorul exemplu de cod arată cum să mutați o poziție a cursorului într-o celulă de tabel specificată:

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");

Puteți trece la un anumit câmp din documentul dvs. utilizând metoda MoveToField. În plus, puteți trece la un câmp de îmbinare specific utilizând metoda MoveToMergeField.

Următorul exemplu de cod arată cum să mutați cursorul document builder într - un anumit câmp:

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.");

Puteți trece la începutul unui antet sau subsol utilizând metoda MoveToHeaderFooter.

Următorul exemplu de cod arată cum să mutați cursorul document builder într-un antet sau subsol de document:

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);

Puteți trece la o anumită secțiune sau paragraf utilizând metodele MoveToParagraph sau MoveToSection. În plus, puteți specifica un index pentru a muta cursorul în orice poziție sau un caracter specificat într-un paragraf din metoda MoveToParagraph.

Următorul exemplu de cod arată cum să treceți la o anumită secțiune și la un anumit paragraf dintr-un document:

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);