Navigazione con cursore
Mentre lavori con un documento, anche se è breve o lungo, dovrai navigare nel documento. La navigazione con un cursore virtuale rappresenta la possibilità di navigare tra diversi nodi in un documento.
All’interno di un breve documento, muoversi in un documento è semplice in quanto è possibile spostare il punto di inserimento anche utilizzando i tasti freccia della tastiera o facendo clic con il mouse per individuare il punto di inserimento dove si desidera. Ma una volta che hai un documento di grandi dimensioni che ha molte pagine, queste tecniche di base saranno insufficienti.
Questo articolo spiega come spostarsi in un documento e spostarsi con un cursore virtuale in diverse parti di esso.
Rilevamento della posizione corrente del cursore
Prima di iniziare il processo di navigazione nel documento, è necessario ottenere il nodo attualmente selezionato. È possibile ottenere la posizione esatta del cursore su un nodo selezionato utilizzando la proprietà CurrentNode. Inoltre, invece di ottenere il nodo corrente, è possibile ottenere il paragrafo attualmente selezionato o la sezione attualmente selezionata utilizzando le proprietà CurrentParagraph e CurrentSection.
Qualsiasi operazione di inserimento eseguita utilizzando DocumentBuilder verrà inserita prima di CurrentNode. Quando il paragrafo corrente è vuoto o il cursore è posizionato appena prima della fine del paragrafo, CurrentNode restituisce nullptr.
Metodi di navigazione in un documento
Quando si modifica il testo, è importante sapere come navigare nel documento e dove spostarlo esattamente. Aspose.Words consente di spostarsi in un documento e passare alle sue diverse sezioni e parti, in modo simile alla funzionalità del riquadro di spostamento in Microsoft Word per andare a una pagina o all’intestazione di un documento Word senza scorrere.
Il metodo principale è quello di essere in grado di spostare la posizione del cursore su un nodo specifico nel documento, è possibile ottenere ciò utilizzando il metodo MoveTo.
L’esempio di codice seguente mostra come spostare DocumentBuilder in nodi diversi in un documento:
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()); |
Ma oltre al metodo di base MoveTo, ce ne sono di più specifici.
Passare all’inizio o alla fine di un documento
Puoi andare all’inizio o alla fine del documento usando i metodi MoveToDocumentStart e MoveToDocumentEnd.
L’esempio di codice seguente mostra come spostare la posizione del cursore all’inizio o alla fine di un documento:
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."); |
Navigare con i segnalibri
È possibile contrassegnare un luogo che si desidera trovare e spostarlo di nuovo facilmente. È possibile inserire tutti i segnalibri nel documento che si desidera e quindi navigare attraverso di essi identificando i segnalibri con nomi univoci. È possibile passare a un segnalibro utilizzando il metodo MoveToBookmark.
Gli esempi di codice seguenti mostrano come spostare una posizione del cursore in un segnalibro:
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()); |
Passare alle celle della tabella
È possibile passare a una cella di tabella utilizzando il metodo MoveToCell. Questo metodo vi permetterà di navigare il cursore in qualsiasi cella in una tabella specifica. Inoltre, è possibile specificare un indice per spostare il cursore in qualsiasi posizione o carattere specificato in una cella all’interno del metodo MoveToCell.
L’esempio di codice seguente mostra come spostare una posizione del cursore in una cella di tabella specificata:
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"); |
Passare a un campo
È possibile passare a un campo specifico nel documento utilizzando il metodo MoveToField. Inoltre, è possibile passare a un campo di unione specifico utilizzando il metodo MoveToMergeField.
L’esempio di codice seguente mostra come spostare il cursore del generatore di documenti in un campo specifico:
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."); |
Passare a un’intestazione o piè di pagina
È possibile passare all’inizio di un’intestazione o di un piè di pagina utilizzando il metodo MoveToHeaderFooter.
L’esempio di codice seguente mostra come spostare il cursore del generatore di documenti in un’intestazione o piè di pagina del documento:
Passare a una sezione o a un paragrafo
È possibile passare a una sezione o a un paragrafo specifici utilizzando i metodi MoveToParagraph o MoveToSection. Inoltre, è possibile specificare un indice per spostare il cursore in qualsiasi posizione o un carattere specificato in un paragrafo all’interno del metodo MoveToParagraph.
L’esempio di codice seguente mostra come passare a una sezione specifica e a un paragrafo specifico in un documento:
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); |