EditableRange Class

Represents a single editable range.
Inheritance Hierarchy

Namespace:  Aspose.Words
Assembly:  Aspose.Words (in Aspose.Words.dll) Version: 20.2
public class EditableRange

The EditableRange type exposes the following members.

Public propertyCode exampleEditableRangeEnd
Gets the node that represents the end of the editable range.
Public propertyCode exampleEditableRangeStart
Gets the node that represents the start of the editable range.
Public propertyCode exampleEditorGroup
Returns or sets an alias (or editing group) which shall be used to determine if the current user shall be allowed to edit this editable range.
Public propertyCode exampleId
Gets the editable range identifier.
Public propertyCode exampleSingleUser
Returns or sets the single user for editable range.
Public methodEquals (Inherited from Object.)
Protected methodFinalize (Inherited from Object.)
Public methodGetHashCode (Inherited from Object.)
Public methodGetType (Inherited from Object.)
Protected methodMemberwiseClone (Inherited from Object.)
Public methodCode exampleRemove
Removes the editable range from the document. Does not remove content inside the editable range.
Public methodToString (Inherited from Object.)

EditableRange is a "facade" object that encapsulates two nodes EditableRangeStart and EditableRangeEnd in a document tree and allows to work with an editable range as a single object.

Shows how to start and end an editable range.
public void CreateEditableRanges()
    Document doc = new Document(MyDir + "Document.docx");
    DocumentBuilder builder = new DocumentBuilder(doc);

    // Start an editable range
    EditableRangeStart edRange1Start = builder.StartEditableRange();

    // An EditableRange object is created for the EditableRangeStart that we just made
    EditableRange editableRange1 = edRange1Start.EditableRange;

    // Put something inside the editable range
    builder.Writeln("Paragraph inside first editable range");

    // An editable range is well-formed if it has a start and an end
    // Multiple editable ranges can be nested and overlapping 
    EditableRangeEnd edRange1End = builder.EndEditableRange();

    // Explicitly state which EditableRangeStart a new EditableRangeEnd should be paired with
    EditableRangeStart edRange2Start = builder.StartEditableRange();
    builder.Writeln("Paragraph inside second editable range");
    EditableRange editableRange2 = edRange2Start.EditableRange;
    EditableRangeEnd edRange2End = builder.EndEditableRange(edRange2Start);

    // Editable range starts and ends have their own respective node types
    Assert.AreEqual(NodeType.EditableRangeStart, edRange1Start.NodeType);
    Assert.AreEqual(NodeType.EditableRangeEnd, edRange1End.NodeType);

    // Editable range IDs are unique and set automatically
    Assert.AreEqual(0, editableRange1.Id);
    Assert.AreEqual(1, editableRange2.Id);

    // Editable range starts and ends always belong to a range
    Assert.AreEqual(edRange1Start, editableRange1.EditableRangeStart);
    Assert.AreEqual(edRange1End, editableRange1.EditableRangeEnd);

    // They also inherit the ID of the entire editable range that they belong to
    Assert.AreEqual(editableRange1.Id, edRange1Start.Id);
    Assert.AreEqual(editableRange1.Id, edRange1End.Id);
    Assert.AreEqual(editableRange2.Id, edRange2Start.EditableRange.Id);
    Assert.AreEqual(editableRange2.Id, edRange2End.EditableRangeStart.EditableRange.Id);

    // If the editable range was found in a document, it will probably have something in the single user property
    // But if we make one programmatically, the property is empty by default
    Assert.AreEqual(string.Empty, editableRange1.SingleUser);

    // We have to set it ourselves if we want the ranges to belong to somebody
    editableRange1.SingleUser = "john.doe@myoffice.com";
    editableRange2.SingleUser = "jane.doe@myoffice.com";

    // Initialize a custom visitor for editable ranges that will print their contents 
    EditableRangeInfoPrinter editableRangeReader = new EditableRangeInfoPrinter();

    // Both the start and end of an editable range can accept visitors, but not the editable range itself

    // Or, if we want to go over all the editable ranges in a document, we can get the document to accept the visitor


/// <summary>
/// Visitor implementation that prints attributes and contents of ranges.
/// </summary>
public class EditableRangeInfoPrinter : DocumentVisitor
    public EditableRangeInfoPrinter()
        mBuilder = new StringBuilder();

    public string ToText()
        return mBuilder.ToString();

    public void Reset()
        mInsideEditableRange = false;

    /// <summary>
    /// Called when an EditableRangeStart node is encountered in the document.
    /// </summary>
    public override VisitorAction VisitEditableRangeStart(EditableRangeStart editableRangeStart)
        mBuilder.AppendLine(" -- Editable range found! -- ");
        mBuilder.AppendLine("\tID: " + editableRangeStart.Id);
        mBuilder.AppendLine("\tUser: " + editableRangeStart.EditableRange.SingleUser);
        mBuilder.AppendLine("\tContents: ");

        mInsideEditableRange = true;

        // Let the visitor continue visiting other nodes
        return VisitorAction.Continue;

    /// <summary>
    /// Called when an EditableRangeEnd node is encountered in the document.
    /// </summary>
    public override VisitorAction VisitEditableRangeEnd(EditableRangeEnd editableRangeEnd)
        mBuilder.AppendLine(" -- End of editable range -- ");

        mInsideEditableRange = false;

        // Let the visitor continue visiting other nodes
        return VisitorAction.Continue;

    /// <summary>
    /// Called when a Run node is encountered in the document. Only runs within editable ranges have their contents recorded.
    /// </summary>
    public override VisitorAction VisitRun(Run run)
        if (mInsideEditableRange) mBuilder.AppendLine("\t\"" + run.Text + "\"");

        // Let the visitor continue visiting other nodes
        return VisitorAction.Continue;

    private bool mInsideEditableRange;
    private readonly StringBuilder mBuilder;
See Also