From b263a9d9c55b70cae441f870d6720ec82ac7ccc8 Mon Sep 17 00:00:00 2001 From: anmcgrath Date: Sun, 30 Jun 2024 15:36:05 +1000 Subject: [PATCH] Better handle merges with hidden rows/columns. --- src/BlazorDatasheet/DatasheetRow.razor | 68 +++++++++++++------ .../VirtualMergesRenderer.razor | 4 +- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/BlazorDatasheet/DatasheetRow.razor b/src/BlazorDatasheet/DatasheetRow.razor index 353d64ac..f6d183fa 100644 --- a/src/BlazorDatasheet/DatasheetRow.razor +++ b/src/BlazorDatasheet/DatasheetRow.razor @@ -5,11 +5,11 @@ @for (int j = VisualSheet.Viewport.VisibleRegion.Left; j <= VisualSheet.Viewport.VisibleRegion.Right; j++) { var col = j; - var cell = VisualSheet.GetVisualCell(Row, col); - - if(!cell.IsVisible) + var visualCell = VisualSheet.GetVisualCell(Row, col); + + if (!visualCell.IsVisible) continue; - + var k = col; var rowSpan = 1; @@ -17,17 +17,41 @@ var dataCol = col; var dataRow = Row; - if (!Virtualise && cell.Merge != null) + if (!Virtualise && visualCell.Merge != null) { - if (cell.Merge.Top == Row && cell.Merge.Left == col) + if (!Sheet.Rows.IsVisible(Row) || !Sheet.Rows.IsVisible(col)) + continue; + + if (Sheet.Rows.IsVisible(visualCell.Merge.Top) && Sheet.Columns.IsVisible(visualCell.Merge.Left)) { - rowSpan = cell.Merge.Height; - colSpan = cell.Merge.Width; - dataCol = cell.Merge.Left; - dataRow = cell.Merge.Top; + if (visualCell.Merge.Top == Row && visualCell.Merge.Left == col) + { + rowSpan = Sheet.Rows.CountVisible(Row, visualCell.Merge.Bottom); + colSpan = Sheet.Columns.CountVisible(col, visualCell.Merge.Right); + dataCol = visualCell.Merge.Left; + dataRow = visualCell.Merge.Top; + } + else + continue; + } + else // cell top left is not visible + { + var nextVisibleRow = Sheet.Rows.GetNextVisible(visualCell.Merge.Top - 1); + var nextVisibleCol = Sheet.Columns.GetNextVisible(visualCell.Merge.Left - 1); + + if (nextVisibleCol == col && nextVisibleRow == Row) + { + rowSpan = Sheet.Rows.CountVisible(Row, visualCell.Merge.Bottom); + colSpan = Sheet.Columns.CountVisible(col, visualCell.Merge.Right); + dataCol = visualCell.Merge.Left; + dataRow = visualCell.Merge.Top; + visualCell = VisualSheet.GetVisualCell(visualCell.Merge.Top, visualCell.Merge.Left); + } + else + { + continue; + } } - else - continue; } + style="@visualCell.FormatStyleString">
- @if (cell.Icon != null) + @if (visualCell.Icon != null) {
- @GetIconRenderFragment(cell.Icon) + style="margin-right:2px; float:left; color: @(visualCell.Format?.IconColor ?? "var(--icon-color)");"> + @GetIconRenderFragment(visualCell.Icon)
} - @switch (cell.CellType) + @switch (visualCell.CellType) { case "default": case "datetime":
- @cell.FormattedString + @visualCell.FormattedString
break; case "boolean": - + break; case "select": - + break; default: + Parameters="@GetCellRendererParameters(visualCell)" + Type="@GetCellRendererType(visualCell.CellType)"/> break; }
diff --git a/src/BlazorDatasheet/VirtualMergesRenderer.razor b/src/BlazorDatasheet/VirtualMergesRenderer.razor index 35bbbe1e..c316e621 100644 --- a/src/BlazorDatasheet/VirtualMergesRenderer.razor +++ b/src/BlazorDatasheet/VirtualMergesRenderer.razor @@ -122,11 +122,11 @@ if (isMergeStartVisible) return true; - var nextVisibleRow = Sheet.Rows.GetNextVisible(merge.Top); + var nextVisibleRow = Sheet.Rows.GetNextVisible(merge.Top - 1); if (!merge.Spans(nextVisibleRow, Axis.Row)) return false; - var nextVisibleCol = Sheet.Columns.GetNextVisible(merge.Left); + var nextVisibleCol = Sheet.Columns.GetNextVisible(merge.Left - 1); if (!merge.Spans(nextVisibleCol, Axis.Col)) return false; return true;