{"record":{"id":"d5d740069c8478ef","repo":"spectreconsole/spectre.console","slug":"column-spanning-is-not-supported-in-table-rowtype","errorCode":null,"errorMessage":"Column spanning is not supported in table {rowType} rows.","messagePattern":"Column spanning is not supported in table (.+?) rows\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Spectre.Console/Widgets/Table/TableRow.cs","lineNumber":45,"sourceCode":"\n    /// <summary>\n    /// Initializes a new instance of the <see cref=\"TableRow\"/> class.\n    /// </summary>\n    /// <param name=\"items\">The row items.</param>\n    public TableRow(IEnumerable<IRenderable> items)\n        : this(items, false, false)\n    {\n    }\n\n    private TableRow(IEnumerable<IRenderable> items, bool isHeader, bool isFooter)\n    {\n        _items = new List<IRenderable>(items ?? []);\n\n        // Reject column spanning in header or footer rows\n        if ((isHeader || isFooter) && _items.OfType<TableCell>().Any(cell => cell.ColumnSpan > 1))\n        {\n            var rowType = isHeader ? \"header\" : \"footer\";\n            throw new InvalidOperationException($\"Column spanning is not supported in table {rowType} rows.\");\n        }\n\n        IsHeader = isHeader;\n        IsFooter = isFooter;\n    }\n\n    internal static TableRow Header(IEnumerable<IRenderable> items)\n    {\n        return new TableRow(items, true, false);\n    }\n\n    internal static TableRow Footer(IEnumerable<IRenderable> items)\n    {\n        return new TableRow(items, false, true);\n    }\n\n    internal void Add(IRenderable item)\n    {","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/spectreconsole/spectre.console/blob/0acc92fada6c42f13984e79c2b5f3d993bdfb099/src/Spectre.Console/Widgets/Table/TableRow.cs#L27-L63","documentation":"TableRow is constructed privately; the internal Header(...) and Footer(...) factories pass isHeader/isFooter=true. The constructor scans its items and, if any TableCell has ColumnSpan > 1, throws InvalidOperationException naming the row type ('header' or 'footer'). This is the row-level enforcement that backs the TableColumn.Header/Footer setters.","triggerScenarios":"Internally when a header or footer row is built containing a TableCell with ColumnSpan > 1 — e.g. table via APIs that assemble header/footer rows from TableCell instances. Also reachable when a user constructs/inserts a spanning cell into a row later flagged as header/footer.","commonSituations":"Mixing spanned body cells into header/footer construction paths; library version changes that route the same cell list through the header/footer factory; reusing a cell collection for both header and body.","solutions":["Ensure header/footer rows contain only non-spanning renderables (plain Markup or non-TableCell IRenderables).","Build header/footer cells from a separate, span-free source distinct from body cells.","Reset or replace spanned TableCells before they enter a header/footer row."],"exampleFix":"// before\nvar headerCells = new IRenderable[] { new TableCell(\"H\").Span(2) };\n\n// after\nvar headerCells = new IRenderable[] { new Markup(\"H1\"), new Markup(\"H2\") };","handlingStrategy":"validation","validationCode":"bool HasSpanningCell(IEnumerable<IRenderable> cells) =>\n    cells.OfType<TableCell>().Any(c => c.ColumnSpan > 1);\nif (HasSpanningCell(headerOrFooterCells))\n    throw new InvalidOperationException(\"Header/footer rows must not contain spanning cells.\");","typeGuard":"static bool RowHasNoSpans(IEnumerable<IRenderable> cells) =>\n    !cells.OfType<TableCell>().Any(c => c.ColumnSpan > 1);","tryCatchPattern":null,"preventionTips":["Construct header/footer rows only from plain Markup or non-spanning renderables.","Keep a distinct, span-free cell list for header and footer.","Reset or replace any spanned TableCell before it enters a header/footer row."],"tags":["table","header","footer","column-span","row","invalid-operation"],"backgroundTag":null,"analyzedSha":"0acc92fada6c42f13984e79c2b5f3d993bdfb099","analyzedAt":"2026-08-13T18:27:21.983Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}