CommentRangeEnd
Inhalt
[
Ausblenden
]CommentRangeEnd class
Kennzeichnet das Ende eines Textbereichs, dem ein Kommentar zugeordnet ist.
Um mehr zu erfahren, besuchen Sie dieArbeiten mit Kommentaren Dokumentationsartikel.
public sealed class CommentRangeEnd : Node
Konstrukteure
Name | Beschreibung |
---|---|
CommentRangeEnd(DocumentBase, int) | Initialisiert eine neue Instanz dieser Klasse. |
Eigenschaften
Name | Beschreibung |
---|---|
CustomNodeId { get; set; } | Gibt die benutzerdefinierte Knotenkennung an. |
virtual Document { get; } | Ruft das Dokument ab, zu dem dieser Knoten gehört. |
Id { get; set; } | Gibt die Kennung des Kommentars an, mit dem dieser Bereich verknüpft ist. |
virtual IsComposite { get; } | RückgabenWAHR wenn dieser Knoten andere Knoten enthalten kann. |
NextSibling { get; } | Ruft den Knoten ab, der diesem Knoten unmittelbar folgt. |
override NodeType { get; } | RückgabenCommentRangeEnd . |
ParentNode { get; } | Ruft den unmittelbar übergeordneten Knoten dieses Knotens ab. |
PreviousSibling { get; } | Ruft den Knoten ab, der diesem Knoten unmittelbar vorausgeht. |
Range { get; } | Gibt einenRange Objekt, das den Teil eines Dokuments darstellt, der in diesem Knoten enthalten ist. |
Methoden
Name | Beschreibung |
---|---|
override Accept(DocumentVisitor) | Nimmt einen Besucher auf. |
Clone(bool) | Erstellt ein Duplikat des Knotens. |
GetAncestor(NodeType) | Ruft den ersten Vorfahren des angegebenenNodeType . |
GetAncestor(Type) | Ruft den ersten Vorgänger des angegebenen Objekttyps ab. |
virtual GetText() | Ruft den Text dieses Knotens und aller seiner untergeordneten Knoten ab. |
NextPreOrder(Node) | Ruft den nächsten Knoten gemäß dem Pre-Order-Tree-Traversal-Algorithmus ab. |
PreviousPreOrder(Node) | Ruft den vorherigen Knoten gemäß dem Pre-Order-Tree-Traversal-Algorithmus ab. |
Remove() | Entfernt sich selbst vom übergeordneten Element. |
ToString(SaveFormat) | Exportiert den Inhalt des Knotens in eine Zeichenfolge im angegebenen Format. |
ToString(SaveOptions) | Exportiert den Inhalt des Knotens unter Verwendung der angegebenen Speicheroptionen in eine Zeichenfolge. |
Bemerkungen
Um einen Kommentar zu erstellen, der an einem Textbereich verankert ist, müssen Sie einenComment
und dann erstellenCommentRangeStart
UndCommentRangeEnd
und setzen Sie ihre Kennungen auf den gleichenId
Wert.
CommentRangeEnd
ist ein Inline-Level-Knoten und kann nur ein Kind vonParagraph
.
Beispiele
Zeigt, wie der Inhalt aller Kommentare und deren Kommentarbereiche mithilfe eines Dokumentbetrachters gedruckt werden.
public void CreateCommentsAndPrintAllInfo()
{
Document doc = new Document();
Comment newComment = new Comment(doc)
{
Author = "VDeryushev",
Initial = "VD",
DateTime = DateTime.Now
};
newComment.SetText("Comment regarding text.");
// Fügen Sie dem Dokument Text hinzu, verzerren Sie ihn in einem Kommentarbereich und fügen Sie dann Ihren Kommentar hinzu.
Paragraph para = doc.FirstSection.Body.FirstParagraph;
para.AppendChild(new CommentRangeStart(doc, newComment.Id));
para.AppendChild(new Run(doc, "Commented text."));
para.AppendChild(new CommentRangeEnd(doc, newComment.Id));
para.AppendChild(newComment);
// Fügen Sie dem Kommentar zwei Antworten hinzu.
newComment.AddReply("John Doe", "JD", DateTime.Now, "New reply.");
newComment.AddReply("John Doe", "JD", DateTime.Now, "Another reply.");
PrintAllCommentInfo(doc.GetChildNodes(NodeType.Comment, true));
}
/// <summary>
/// Durchläuft jeden Kommentar der obersten Ebene und druckt seinen Kommentarbereich, Inhalt und seine Antworten.
/// </summary>
private static void PrintAllCommentInfo(NodeCollection comments)
{
CommentInfoPrinter commentVisitor = new CommentInfoPrinter();
// Durchlaufe alle Kommentare der obersten Ebene. Im Gegensatz zu Kommentaren vom Typ „Antwort“ haben Kommentare der obersten Ebene keinen Vorgänger.
foreach (Comment comment in comments.Where(c => ((Comment)c).Ancestor == null).ToList())
{
// Besuchen Sie zuerst den Anfang des Kommentarbereichs.
CommentRangeStart commentRangeStart = (CommentRangeStart)comment.PreviousSibling.PreviousSibling.PreviousSibling;
commentRangeStart.Accept(commentVisitor);
// Sehen Sie sich dann den Kommentar und alle Antworten an, die er möglicherweise enthält.
comment.Accept(commentVisitor);
// Besuchen Sie nur den Anfang des Kommentars.
comment.AcceptStart(commentVisitor);
// Besuchen Sie nur das Ende des Kommentars.
comment.AcceptEnd(commentVisitor);
foreach (Comment reply in comment.Replies)
reply.Accept(commentVisitor);
// Besuchen Sie abschließend das Ende des Kommentarbereichs und drucken Sie dann den Textinhalt des Besuchers.
CommentRangeEnd commentRangeEnd = (CommentRangeEnd)comment.PreviousSibling;
commentRangeEnd.Accept(commentVisitor);
Console.WriteLine(commentVisitor.GetText());
}
}
/// <summary>
/// Druckt Informationen und Inhalte aller im Dokument vorkommenden Kommentare und Kommentarbereiche.
/// </summary>
public class CommentInfoPrinter : DocumentVisitor
{
public CommentInfoPrinter()
{
mBuilder = new StringBuilder();
mVisitorIsInsideComment = false;
}
/// <summary>
/// Ruft den Klartext des vom Besucher gesammelten Dokuments ab.
/// </summary>
public string GetText()
{
return mBuilder.ToString();
}
/// <summary>
/// Wird aufgerufen, wenn im Dokument ein Run-Knoten gefunden wird.
/// </summary>
public override VisitorAction VisitRun(Run run)
{
if (mVisitorIsInsideComment) IndentAndAppendLine("[Run] \"" + run.Text + "\"");
return VisitorAction.Continue;
}
/// <summary>
/// Wird aufgerufen, wenn im Dokument ein CommentRangeStart-Knoten gefunden wird.
/// </summary>
public override VisitorAction VisitCommentRangeStart(CommentRangeStart commentRangeStart)
{
IndentAndAppendLine("[Comment range start] ID: " + commentRangeStart.Id);
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
return VisitorAction.Continue;
}
/// <summary>
/// Wird aufgerufen, wenn im Dokument ein CommentRangeEnd-Knoten gefunden wird.
/// </summary>
public override VisitorAction VisitCommentRangeEnd(CommentRangeEnd commentRangeEnd)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Comment range end] ID: " + commentRangeEnd.Id + "\n");
mVisitorIsInsideComment = false;
return VisitorAction.Continue;
}
/// <summary>
/// Wird aufgerufen, wenn im Dokument ein Kommentarknoten gefunden wird.
/// </summary>
public override VisitorAction VisitCommentStart(Comment comment)
{
IndentAndAppendLine(
$"[Comment start] For comment range ID {comment.Id}, By {comment.Author} on {comment.DateTime}");
mDocTraversalDepth++;
mVisitorIsInsideComment = true;
return VisitorAction.Continue;
}
/// <summary>
/// Wird aufgerufen, wenn der Besuch eines Kommentarknotens im Dokument beendet ist.
/// </summary>
public override VisitorAction VisitCommentEnd(Comment comment)
{
mDocTraversalDepth--;
IndentAndAppendLine("[Comment end]");
mVisitorIsInsideComment = false;
return VisitorAction.Continue;
}
/// <summary>
/// Fügen Sie dem StringBuilder eine Zeile hinzu und rücken Sie sie ein, je nachdem, wie tief der Besucher im Dokumentbaum ist.
/// </summary>
/// <param name="text"></param>
private void IndentAndAppendLine(string text)
{
for (int i = 0; i < mDocTraversalDepth; i++)
{
mBuilder.Append("| ");
}
mBuilder.AppendLine(text);
}
private bool mVisitorIsInsideComment;
private int mDocTraversalDepth;
private readonly StringBuilder mBuilder;
}
Siehe auch
- class Node
- namensraum Aspose.Words
- Montage Aspose.Words