Table Authoring Service

The Content.TableAuthoringService property on WpfHtmlEditor returns an ITableAuthoringService instance. It exposes every table-level command -- insert and delete rows and columns, merge selected cells, manage the zero-border guideline overlay, and access the lower-level ITableManipulator. Drive the service from a custom ribbon, a key binding, or an automation routine.

Namespace: SpiceLogic.HtmlEditor.Abstractions.Services.ElementAuthoring
Assembly: SpiceLogic.HtmlEditor.Abstractions.dll
Accessor: MyEditor.Content.TableAuthoringService

The service implements IDisposable; the editor owns its lifetime, so customer code never needs to call Dispose directly.

InsertColumn(InsertPositions position)

Inserts a new empty column adjacent to the column that currently contains the caret.

Syntax
void InsertColumn(InsertPositions position);
Parameters
NameTypeDescription
positionInsertPositionsInsertPositions.Before inserts the new column to the left of the caret column; InsertPositions.After inserts it to the right.
Remarks

The caret must be inside a table cell; otherwise the call is a no-op.

Example
using SpiceLogic.HtmlEditor.Abstractions;
using SpiceLogic.HtmlEditor.Abstractions.Services.ElementAuthoring;

ITableAuthoringService tables = MyEditor.Content.TableAuthoringService;
tables.InsertColumn(InsertPositions.Before);
Imports SpiceLogic.HtmlEditor.Abstractions
Imports SpiceLogic.HtmlEditor.Abstractions.Services.ElementAuthoring

Dim tables As ITableAuthoringService = MyEditor.Content.TableAuthoringService
tables.InsertColumn(InsertPositions.Before)

DeleteColumn()

Removes the column that currently contains the caret. If the deleted column was the last column in the table, the table itself is removed.

Syntax
void DeleteColumn();
Example
private void DeleteColumn_Click(object sender, RoutedEventArgs e)
{
    MyEditor.Content.TableAuthoringService.DeleteColumn();
}
Private Sub DeleteColumn_Click(sender As Object, e As RoutedEventArgs)
    MyEditor.Content.TableAuthoringService.DeleteColumn()
End Sub

InsertRow(InsertPositions position)

Inserts a new empty row adjacent to the row that currently contains the caret.

Syntax
void InsertRow(InsertPositions position);
Parameters
NameTypeDescription
positionInsertPositionsInsertPositions.Before inserts the row above the caret row; InsertPositions.After inserts it below.
Example
MyEditor.Content.TableAuthoringService.InsertRow(InsertPositions.After);

DeleteRow()

Removes the row that currently contains the caret. If the deleted row was the last row, the table itself is removed.

Syntax
void DeleteRow();
Example
if (MessageBox.Show("Delete current row?", "Confirm", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
    MyEditor.Content.TableAuthoringService.DeleteRow();
}
If MessageBox.Show("Delete current row?", "Confirm", MessageBoxButton.YesNo) Is MessageBoxResult.Yes Then
    MyEditor.Content.TableAuthoringService.DeleteRow()
End If

MergeSelectedCells()

Merges the cells in the current selection into a single cell. The merge uses colspan / rowspan attributes on the surviving cell and discards the others.

Syntax
void MergeSelectedCells();
Remarks

Call CanMergeCells() first. The merge is disabled when EnableTableCellMerging is false.

Example
var tables = MyEditor.Content.TableAuthoringService;
if (tables.CanMergeCells())
{
    tables.MergeSelectedCells();
}
Dim tables = MyEditor.Content.TableAuthoringService

If tables.CanMergeCells() Then
    tables.MergeSelectedCells()
End If

ShowGuidelinesForTablesWithZeroBorder(bool inBackground = false)

Applies a dotted CSS outline to every table whose border attribute is 0 so authors can still see cell boundaries while editing. The outline is visual only and is stripped before the HTML is returned to the customer.

Syntax
void ShowGuidelinesForTablesWithZeroBorder(bool inBackground = false);
Parameters
NameTypeDescription
inBackgroundboolWhen true, the DOM walk skips forcing layout updates -- pass true from background-paint code paths to avoid flicker. Defaults to false.
Example
private void ToggleGuides_Click(object sender, RoutedEventArgs e)
{
    MyEditor.Content.TableAuthoringService.ShowGuidelinesForTablesWithZeroBorder();
}
Private Sub ToggleGuides_Click(sender As Object, e As RoutedEventArgs)
    MyEditor.Content.TableAuthoringService.ShowGuidelinesForTablesWithZeroBorder()
End Sub

HideGuidelinesOfTablesWithZeroBorder(bool inBackground = false)

Removes the dotted overlay added by ShowGuidelinesForTablesWithZeroBorder.

Syntax
void HideGuidelinesOfTablesWithZeroBorder(bool inBackground = false);
Parameters
NameTypeDescription
inBackgroundboolPass the same value used in the matching ShowGuidelinesForTablesWithZeroBorder call.
Example
MyEditor.Content.TableAuthoringService
    .HideGuidelinesOfTablesWithZeroBorder();

IsTableBorderZero(IHTMLElement tableElement)

Returns true when the supplied table element has a border attribute of 0 (and is therefore a candidate for the zero-border guideline overlay).

Syntax
bool IsTableBorderZero(IHTMLElement tableElement);
Parameters
NameTypeDescription
tableElementmshtml.IHTMLElementThe HTML <table> element to inspect.
Returns

true if the element's border attribute is "0" or missing; otherwise false.

Example
using mshtml;

var tables = MyEditor.Content.TableAuthoringService;
IHTMLElement table = MyEditor.StateQuery.GetActiveHtmlElement();
if (table?.tagName == "TABLE" && tables.IsTableBorderZero(table))
{
    tables.ShowGuidelinesForTablesWithZeroBorder();
}
Imports mshtml

Dim tables = MyEditor.Content.TableAuthoringService
Dim table As IHTMLElement = MyEditor.StateQuery.GetActiveHtmlElement()

If table?.tagName Is "TABLE" AndAlso tables.IsTableBorderZero(table) Then
    tables.ShowGuidelinesForTablesWithZeroBorder()
End If

CanMergeCells()

Reports whether the current cell selection can be merged.

Syntax
bool CanMergeCells();
Returns

true if at least two adjacent table cells are selected and cell merging is enabled; otherwise false. Use this to drive the enabled state of a custom Merge-Cells command.

Example
MyEditor.SelectionChanged += (s, e) =>
{
    MergeCellsButton.IsEnabled =
        MyEditor.Content.TableAuthoringService.CanMergeCells();
};

GetTableManipulator()

Returns the lower-level ITableManipulator the service uses internally. Use this when you need direct row/column DOM access beyond the high-level methods above.

Syntax
ITableManipulator GetTableManipulator();
Returns

The shared ITableManipulator instance, or null when the caret is not inside a table.

Example
var manip = MyEditor.Content.TableAuthoringService.GetTableManipulator();
if (manip != null && manip.CanMerge())
{
    Debug.WriteLine("Selection can be merged.");
}
Dim manip = MyEditor.Content.TableAuthoringService.GetTableManipulator()

If manip IsNot Nothing AndAlso manip.CanMerge() Then
    Debug.WriteLine("Selection can be merged.")
End If

ResetTableManipulator()

Discards the cached ITableManipulator so that the next call to GetTableManipulator re-creates one against the current document. Call this after replacing the document HTML wholesale.

Syntax
void ResetTableManipulator();
Example
MyEditor.Content.LoadBodyHtml("<table><tr><td>Z</td></tr></table>");
MyEditor.Content.TableAuthoringService.ResetTableManipulator();

SelectedCellBackgroundColor Property

Gets or sets the background color used to highlight cells that are part of the current multi-cell selection (the visual feedback the editor draws while the user drags across cells).

Syntax
Color SelectedCellBackgroundColor { get; set; }
Property Value

A System.Drawing.Color. The default is a light blue chosen for legibility on most page backgrounds.

Example
using System.Drawing;

MyEditor.Content.TableAuthoringService.SelectedCellBackgroundColor = Color.FromArgb(120, 0, 122, 204); // brand-blue overlay
Imports System.Drawing

MyEditor.Content.TableAuthoringService.SelectedCellBackgroundColor = Color.FromArgb(120, 0, 122, 204) ' brand-blue overlay

EnableTableCellMerging Property

Gets or sets whether the service permits cell merging. When false, MergeSelectedCells and CanMergeCells are inert.

Syntax
bool EnableTableCellMerging { get; set; }
Property Value

true to allow cell merging; false to forbid it. The editor mirrors this from Options.EnableTableCellMerge at startup.

Example
// Make cell-merging available only in expert mode.
MyEditor.Content.TableAuthoringService.EnableTableCellMerging = appPrefs.ExpertMode;
Last updated on May 14, 2026