Navigace s kurzorem
Při práci s dokumentem, i když je krátký nebo dlouhý, budete muset dokument procházet. Navigace pomocí virtuálního kurzoru představuje schopnost procházet mezi různými uzly v dokumentu.
V krátkém dokumentu je pohyb v dokumentu jednoduchý, protože kurzor můžete přesunout i pomocí kláves se šipkami na klávesnici nebo kliknutím myši a vyhledejte kurzor kdekoli chcete. Ale jakmile budete mít velký dokument, který má mnoho stránek, budou tyto základní techniky nedostatečné.
Tento článek vysvětluje, jak se pohybovat v dokumentu a navigovat pomocí virtuálního kurzoru do různých jeho částí.
Detekce Aktuální Polohy Kurzoru
Před zahájením procesu navigace v dokumentu budete muset získat uzel, který je aktuálně vybrán. Přesnou polohu kurzoru ve vybraném uzlu můžete získat pomocí Vlastnosti CurrentNode. Kromě toho můžete místo získání aktuálního uzlu získat aktuálně vybraný odstavec nebo aktuálně vybranou sekci pomocí vlastností CurrentParagraph a CurrentSection.
Všechny operace vložení, které provedete pomocí DocumentBuilder, budou vloženy před CurrentNode. Když je aktuální odstavec prázdný nebo je kurzor umístěn těsně před koncem odstavce, CurrentNode vrátí nullptr.
Navigace v dokumentu
Při úpravách textu je důležité vědět, jak se v dokumentu pohybovat a kam přesně se v něm pohybovat. Aspose.Words umožňuje pohybovat se v dokumentu a přecházet do jeho různých částí a částí – to je podobné funkci navigačního podokna v Microsoft Word pro přechod na stránku nebo Nadpis v Word dokumentu bez posouvání.
Hlavní metodou je možnost přesunout pozici kurzoru na konkrétní uzel v dokumentu, čehož lze dosáhnout pomocí metody MoveTo.
Následující příklad kódu ukazuje, jak přesunout DocumentBuilder do různých uzlů v dokumentu:
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()); |
Ale kromě základní metody MoveTo existují i konkrétnější.
Přejděte na začátek nebo konec dokumentu
Můžete přejít na začátek nebo konec dokumentu pomocí metod MoveToDocumentStart a MoveToDocumentEnd.
Následující příklad kódu ukazuje, jak přesunout pozici kurzoru na začátek nebo konec dokumentu:
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."); |
Navigace Se Záložkami
Můžete označit místo, které chcete najít, a snadno se k němu znovu přesunout. Do dokumentu můžete vložit tolik záložek, kolik chcete, a poté je procházet identifikací záložek s jedinečnými názvy. Na záložku se můžete přesunout pomocí metody MoveToBookmark.
Následující příklady kódu ukazují, jak přesunout pozici kurzoru na záložku:
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()); |
Přejděte na buňky tabulky
Do buňky tabulky se můžete přesunout pomocí metody MoveToCell. Tato metoda vám umožní navigovat kurzor do libovolné buňky v konkrétní tabulce. Kromě toho můžete určit index pro přesun kurzoru na libovolnou pozici nebo zadaný znak v buňce v rámci metody MoveToCell.
Následující příklad kódu ukazuje, jak přesunout pozici kurzoru do určené buňky tabulky:
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"); |
Přejděte do pole
Pomocí metody MoveToField se můžete přesunout do konkrétního pole v dokumentu. Kromě toho můžete přesunout do konkrétního pole sloučení pomocí metody MoveToMergeField.
Následující příklad kódu ukazuje, jak přesunout kurzor tvůrce dokumentů do konkrétního pole:
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."); |
Přejděte na záhlaví nebo zápatí
Pomocí metody MoveToHeaderFooter se můžete přesunout na začátek záhlaví nebo zápatí.
Následující příklad kódu ukazuje, jak přesunout kurzor tvůrce dokumentů do záhlaví nebo zápatí dokumentu:
Přejděte na sekci nebo odstavec
Do určité sekce nebo odstavce se můžete přesunout pomocí metod MoveToParagraph nebo MoveToSection. Kromě toho můžete zadat index pro přesun kurzoru na libovolnou pozici nebo zadaný znak v odstavci v rámci metody MoveToParagraph.
Následující příklad kódu ukazuje, jak přejít na konkrétní oddíl a konkrétní odstavec v dokumentu:
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); |